Nodejs的异步调用循环
nodejs loop of async calls
在这个nodejs函数中,我在mongodb中创建了几个记录使用猫鼬。计数器数出了多少。
export function createTimeslots(req, res){
var startDate = req.body.startDate;
var Duration = req.body.Duration;
var repeat = req.body.repeat;
var counter=0;
for(var i=0; i<repeat; i++){
var startTime = ... calculation
var endTime = ...calculation
var ts = {
startTime: startTime,
endTime: endTime,
};
TimeSlot.create(ts, function(err, timeslot){
counter = counter+1;
});
}
res.status(200).json(counter + ' timeslots created');
}
问题是结果总是"创建了0个时隙"。我怀疑create函数是异步的,当它完成的时候,我们已经不在那里更新计数器了。那么我如何计算这些记录呢?(我知道我可以使用循环的计数器,但我计划做验证在某些情况下,不创造记录。谢谢:)
Promises可以帮到你:
export function createTimeslots(req, res){
var startDate = req.body.startDate;
var Duration = req.body.Duration;
var repeat = req.body.repeat;
var counter=0;
var promises = [];
for(var i=0; i<repeat; i++){
var startTime = ... calculation
var endTime = ...calculation
var ts = {
startTime: startTime,
endTime: endTime,
};
promises.push(new Promise(function(resolve) {
TimeSlot.create(ts, function(err, timeslot) {
counter = counter+1;
resolve();
});
}));
}
Promise.all(promises).then(function() {
res.status(200).json(counter + ' timeslots created');
});
}
这将等待直到所有异步操作完成,然后才继续创建返回消息。
计数器在每次调用createTimeslots时设置为0,因此将其设置为模型变量
var counter=0;
export function createTimeslots(req, res){
var startDate = req.body.startDate;
var Duration = req.body.Duration;
var repeat = req.body.repeat;
for(var i=0; i<repeat; i++){
var startTime = ... calculation
var endTime = ...calculation
var ts = {
startTime: startTime,
endTime: endTime,
};
TimeSlot.create(ts, function(err, timeslot){
counter = counter+1;
});
}
res.status(200).json(counter + ' timeslots created');
}
将计数器移到传递给TimeSlot创建方法的异步回调函数的主体之外。
export function createTimeslots(req, res){
var startDate = req.body.startDate;
var Duration = req.body.Duration;
var repeat = req.body.repeat;
var counter=0;
for(var i=0; i<repeat; i++){
var startTime = ... calculation
var endTime = ...calculation
var ts = {
startTime: startTime,
endTime: endTime,
};
counter = counter+1;
TimeSlot.create(ts, function(err, timeslot){
// do stuff with counter
});
}
res.status(200).json(counter + ' timeslots created');
}
相关文章:
- 等待循环调用的所有承诺完成
- 为循环调用JavaScript中的SQL
- 如何在每个元素上循环调用jquery.each的数组
- 而循环调用setTimeout不起作用
- jquery每个带有参数的循环调用函数
- 本机 Ajax 中的循环调用函数
- jQuery函数使用包含setTimeout的每个循环调用自身,立即发生,而不是在结束时发生
- 使用for循环调用setTimeout
- 在jquery get请求中从for循环调用var i
- 使用增量ID从循环调用Javascript
- 用javascript中的数组循环调用函数
- document.ready用angular.js以无限循环调用
- 如何在从循环调用的方法中动态分配参数
- 如何在HTML中从for循环调用jQuery函数
- Javascript函数在等待ajax响应时循环调用
- 使用for循环调用函数时浏览器崩溃
- Javascript for循环中的函数被另一个for循环调用
- Javascript循环调用函数
- 你能从PHP循环调用JavaScript函数吗?
- 而Number原型扩展中的循环调用函数一次,然后出现未定义的错误