等待循环中的函数完成
Wait for functions in for loop to finish
我在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循环和回调完成?
下面是一个使用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');
});
您可以使用异步库函数whils()来等待所有查询完成:
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
}
);
相关文章:
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 如何在返回值(Js)时不中断函数/循环
- 函数在自己的循环中使用 i,以及一个子函数循环 - var 的行为类似于 let
- 我可以在 jquery 中对函数循环使用相同的返回值吗?
- 如何使用 each() 函数循环访问 JSON 文件
- jQuery函数循环两次
- setInterval 函数循环太快
- 简化我的函数(循环、数组)
- 我的 IF 条件如何影响全局变量使函数循环
- 使用ReactJS和concatJSX语法进行渲染时的map函数循环
- 如何通过OnClick函数循环遍历标记元素并在显示器上获得相应的内容
- 函数循环问题
- 将计数器添加到javascript函数循环中
- 通过future函数循环和设置全局变量
- jQuery创建一个函数循环,每个函数都有一个动画队列
- 从另一个函数终止一个活动的javascript函数/循环
- jQuery函数循环:为什么夏奇拉在陌生人吻她时重复吻
- 在一个简单的函数循环中设置style.display时出现了奇怪的行为
- 通过多个函数循环/setinterval
- 试图防止Jquery函数循环