2016-03-31 149 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