nodejs异步调用循环

时间:2016-06-29 01:49:32

标签: javascript node.js mongoose

在这个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时隙创建'。 我怀疑创建函数是异步的,到它完成时, 我们不再有更新柜台了。 那我怎么算这些记录呢? (我知道我可以使用循环计数器,但我打算进行验证 在某些情况下不创建记录。谢谢:))

3 个答案:

答案 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)

每次调用createTimeslots时,

计数器都设置为0,因此将其设为模型变量

&#13;
&#13;
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;
&#13;
&#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');

}