在这个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时隙创建'。 我怀疑创建函数是异步的,到它完成时, 我们不再有更新柜台了。 那我怎么算这些记录呢? (我知道我可以使用循环计数器,但我打算进行验证 在某些情况下不创建记录。谢谢:))
答案 0 :(得分:3)
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');
});
}
这将等到所有异步操作都完成,然后才继续并创建返回消息。
答案 1 :(得分:-1)
计数器都设置为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');
}
&#13;
答案 2 :(得分:-1)
将计数器移到您传递给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');
}