[英]nodejs loop of async calls
在此nodejs函数中,我使用mongoose在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函数是异步的,并且在完成时,我们不再需要更新计数器。 那么我该如何计算这些记录? (我知道我可以使用循环计数器,但是我计划进行验证,在某些情况下不创建记录。谢谢:)
承诺将在这里为您提供帮助:
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时,counter设置为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 create方法的异步回调的主体之外。
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');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.