Как ждать нескольких вложенных массивов - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть запрос ниже с 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 голосов
/ 03 декабря 2018

Для циклов, не ожидающих выполнения обещаний.Вы должны использовать карту.Я вижу, у вас есть карта, которая является правильной, но внутри карты вы используете стандартный цикл 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' })
...