2016-03-31 113 views
-2

我使用node.js和mongoDB以及promises.js。我必须在promise变量中调用一个异步方法,但我不能做一个比()更多的异步方法。因为它在循环中。代码是这样的:我怎样才能像同步方法调用异步方法?

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是一个未定义的变量。我该如何解决这个问题?

+0

不应该currentUser是一个承诺? –

+0

另外,收集一份您想要拉出并在一趟旅程中全部拉出的ID列表不是更好吗? –

+0

(这将巧合地解决你的问题,并且性能更高) –

回答

0

你可以使用deep-populate

async也可以工作:

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) { 
     }); 
    }); 
    }); 
+1

习惯性地用评论来证明负面投票是正确的,所以答案可以得到改善... – malix

+0

从什么时候习惯性证明投票是正确的?习惯上通过评论提供反馈,但这与投票无关。 –

+3

将“习惯”替换为“有益”或“有礼貌” – dandavis