繁体   English   中英

异步调用的nodejs循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM