【问题标题】:How to wait for inside for each to complete before iterating to next loop?如何在迭代到下一个循环之前等待每个内部完成?
【发布时间】:2018-07-27 10:40:22
【问题描述】:

您好,我想为每个实现嵌套。但是在嵌套的 for 循环完成执行之前,for 循环不应该迭代到下一个。我曾尝试使用asyn.forEachOf,但第一个 for 循环执行而不等待第二个 for 循环。我是这样实现的

async.forEachOf(playerIds, function (playerId, key, playerCallback) {
    console.log(playerId);
    //Find coach rating for every player's goals
    DateInfo.find({
        coachId: userId,
        playerId: playerId,
        coachRemoved: false
    }).select('objectiveId frequencyId').populate({
        path: 'objectiveId', match: {'deleted': {$ne: 2}}, select: {'name': 1}
    }).exec(function (error, coachDateInfos) {
        if (error) {
            response.status(200).json({message: error});
        } else {
            console.log(coachDateInfos);
            playerCallback()
        }
    })
});

我还没有在异步函数中发布。我有两个玩家 ID,它首先打印两个玩家 ID,然后打印 coachDateInfos。

【问题讨论】:

    标签: javascript node.js express asynchronous


    【解决方案1】:

    这是因为for-loop同步 动作,而Model.find().exec()异步 动作。你不能把两者混在一起。您可以执行以下操作(没有async lib):

    app.get(async (req, res) => {
      const promises = []
    
      playerIs.forEach(playerId => {
        const promise = DateInfo
          .find({coachId: userId, playerId, coachRemoved: false})
          .select('objectiveId frequencyId')
          .populate({path: 'objectiveId', match: {'deleted': {$ne: 2}}, select: {'name': 1})
          .exec()
    
          promises.push(promise)
      })
    
      try {
        res.json(await Promise.all(promises))
      } catch (err) {
        res.status(200).json(err);
      }
    })
    

    【讨论】:

      【解决方案2】:
      var arrayOfFuncs = [];
      for (var key in playerIds) {
          let player = playerIds[key];
          let func_1 = function(playerId,cb)
          {
              console.log(playerId);
              //Find coach rating for every player's goals
              DateInfo.find({
                  coachId: userId,
                  playerId: playerId,
                  coachRemoved: false
              }).select('objectiveId frequencyId').populate({
                  path: 'objectiveId', match: {'deleted': {$ne: 2}}, select: {'name': 1}
              }).exec(function (error, coachDateInfos) {
                  if (error) {
                      //response.status(200).json({message: error});
                      cb(error, null);
                  } else {
                      console.log(coachDateInfos);
                      cb(null, coachDateInfos);
                  }
              })
          }
          arrayOfFuncs.push(func_1.bind(null,player));
      }
      
      async.parallel(arrayOfFuncs, function(errString, allResults) {
          if(errString) {
              console.log(errString);
          } else {
              console.log(allResults);
          }
      })
      

      【讨论】:

      • 显示错误 let func_1 = function(playerIds[key],cb){ ^ SyntaxError: Unexpected token [
      • 目前我有两个玩家,但总是只需要第二个玩家
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2021-02-15
      相关资源
      最近更新 更多