我在NodeJS中有一个for循环。循环内部是一个从数据库中获取数据的函数。
var player2.schedule = {
opponent: //string
datetime: //date object
}
var schedule = "";
for (i=0; i<player2.schedule.length; i++) {
User.findOne({ id: player2.schedule[i].opponent }.select("name").exec(function(err, opponent) {
schedule += opponent.name;
});
}
循环每次循环时都会使用数据库调用的结果向变量schedule
添加变量。
现在我的问题是,如果我在for循环之后有代码依赖于这个schedule
变量,它就不能。因为变量是在数据库调用的回调函数中更新的,所以for循环之后的任何代码都是异步发生的,因此变量没有及时更新。
如何确保下一批代码等待for循环和回调首先完成?
答案 0 :(得分:1)
以下是使用async
的简单示例:
var async = require('async');
async.each(player2.schedule, function(item, cb) {
User.findOne({ id: item.opponent })
.select("name")
.exec(function(err, opponent) {
if (err)
return cb(err);
schedule += opponent.name;
cb();
});
}, function(err) {
if (err)
throw err;
console.log('All done');
});
答案 1 :(得分:0)
您可以使用async库函数while()等待所有查询完成:
var async = require('async');
var i = 0;
var len = player2.schedule.length;
async.whilst(
function () { return i < len; },
function (callback) {
User.findOne({ id:player2.schedule[i].opponent}.select("name").exec(function(err, opponent) {
schedule += opponent.name;
i++;
callback(null); // assume no error (null)
});
},
function (err) {
// this function is executed after all queries are done
// schedule now has everything from the loop
}
);