我一直指向使用async模块,但我不太确定如何使用瀑布来解决我的问题。
我的原始代码存在异步性问题。
var Image = require('./models/image');
var User = require('./models/user');
var query = Image.find({});
query.limit(10);
query.sort('-date')
query.exec(function (err, collected) {
if (err) return console.error(err);
var i = 0;
var authors = [];
while (i < 8) {
var search = User.find({'twitter.id' : collected[i].author});
search.exec(function (err, user){
if (err) return console.error(err);
var result = (user[0].twitter.username);
authors.push(result);
});
i = i + 1;
}
}
console.log(authors);
我希望authors数组包含所有找到的用户名。但是,当最后一次console.log()调用返回'[]'
时答案 0 :(得分:1)
因此,您希望等待所有搜索首先完成。您应该将所有异步调用放入一个数组中,然后使用异步库将它们链接在一起(瀑布)或同时执行(并行)。并行倾向于执行“更快”:
var searches = [];
while (i < 8) {
var search = User.find({'twitter.id' : collected[i].author});
searches.push(function(cb) {
search.exec(function (err, user){
if (err) cb(err, null);
else cb(null, user[0].twitter.username);
});
});
i++;
}
async.parallel(searches, function( err, authors ) {
if ( err ) return console.error( err );
console.log(authors);
// Authors only defined here.
// TODO: More code
});
// Authors not defined here.