Javascript 如何像同步方法一样调用异步方法?
我将node.js和mongoDB与promissions.js一起使用。我必须在promise变量中调用一个异步方法,但我不能使用另一个。因为它在循环中。代码如下:Javascript 如何像同步方法一样调用异步方法?,javascript,node.js,promise,Javascript,Node.js,Promise,我将node.js和mongoDB与promissions.js一起使用。我必须在promise变量中调用一个异步方法,但我不能使用另一个。因为它在循环中。代码如下: collection1.find({'key': 'value'}) .then(function(matches){ //loop starts matches.forEach(function(match){
collection1.find({'key': 'value'})
.then(function(matches){
//loop starts
matches.forEach(function(match){
var currentUser = collection2.find({"_id" : match._user})
console.log(currentUser); //undefined
})
})
如您所见,currentUser是一个未定义的变量。我如何解决这个问题?您可以使用
异步也可以工作:
function processMatch(match, cb) {
collection2.findOne({"_id":match._user}).then(function(user) {
cb(null, user);
});
}
collection1.find({'key':'value'})
.then(function(matches) {
var async = require('async');
async.mapLimit(results.results, NUMBER_OF_PARALLEL_REQUEST, processMatch, function(err, users) {
users.forEach(function(currentUser) {
});
});
});
currentUser不应该是一个承诺吗?另外,收集一个您想要提取的id列表,并在一次行程中提取所有id不是更好吗?这将巧合地解决您的问题,并提高性能。您需要将日志放入。然后从内部查找中删除,循环没有理由排除承诺的使用……如果你想在整体问题上得到帮助,你需要描述整体问题,包括你的循环和你在循环中试图实现的目标。有很多不同的方法来处理异步操作序列,这些操作传统上可能在循环中完成,但是如何最好地处理它们取决于对整个问题的描述。根据您的标题,答案是您不能像调用sync方法那样调用异步方法。您必须调整所使用的工具和编程方法。相反,该怎么做,需要更多地描述你的问题。习惯上用评论来证明反对投票是正当的,这样答案就可以得到改善……从什么时候开始习惯上证明投票是正当的?通过评论提供反馈是一种习惯,但这与投票无关。用有益或有益的方式代替习惯polite@KevinB-对否决票不加任何评论,就好比让一个孩子暂停,而不告诉他们为什么要受到惩罚。它不太可能影响未来的行为,这是负面反馈的一个重要方面。相反,这只会让每个人都发疯,而且没有真正取得多大成就。因此,stack overflow的好公民在投反对票时选择教书,这样接受者就可以学习,社区也会受益。我从来没有看到过不能用1-2个有针对性的句子来描述的否决票。我不是有意要说些什么,只是感到困惑,想要改进。。。即使是Stackoverflow也会在单击向下箭头时提示@丹达维斯表示同意