如何等待多个嵌套数组

时间:2018-12-03 07:36:07

标签: javascript node.js asynchronous promise async-await

我在下面用mongodb查询。我从前端得到了一系列练习,我需要一个接一个地插入它们。而且在每次练习中我都会得到sets,所以我需要再次遍历它们,还需要代表sets创建多个练习

这是我的nodejs文件中的代码

const createExercises = payload.exercises.map(async(exercise) => {
  for (let i = 1 ; i <= exercise.sets ; i++) {
    console.log(i)
    return (await Exercise.findOneAndUpdate(
      { user, exerciseName: exercise.exerciseName, workoutName: payload.workoutName, sets: i },
      { $set: {
        exerciseName: exercise.exerciseName, sets: i 
      }},
      { upsert: true }
    ))
  }
})
console.log(createExercises)
await Promise.all(createExercises)

return reply({ success: true, message: 'success' })

但是问题是我无法等待响应。我在这里想念的。

编辑-> 现在的问题是我正在console.log(i)console.log(createExercises)

的控制台中获取它
1
[ Promise {<pending>, domain: Domain { } } ]
2
3
4
5

我应该看到什么

1
2
3
4
5

[ Promise {<pending>, domain: Domain { } } ]

谢谢!

1 个答案:

答案 0 :(得分:1)

对于循环不等待承诺被解决的循环。您应该使用地图。我看到您的地图正确,但在地图内部您使用的是标准的for循环,如果Promise等待,则不正确,请参见带有嵌套地图的示例

const createExercises = payload.exercises.map(async(exercise) => {
  return await Promise.all(exercise.sets.map(async (set, index) => {
    return (await Exercise.findOneAndUpdate(
      { user, exerciseName: exercise.exerciseName, workoutName: payload.workoutName, sets: i },
      { $set: {
        exerciseName: exercise.exerciseName, sets: index
      }},
      { upsert: true }
    ))
  }))
})
console.log(createExercises)
await Promise.all(createExercises)

return reply({ success: true, message: 'success' })