Nodejs ждать, пока функция асинхронной карты завершит выполнение

#node.js #arrays #asynchronous

#node.js #массивы #асинхронный

Вопрос:

У меня есть сопоставление массива, и мне нужно выполнить некоторый код после завершения сопоставления.

Вот код сопоставления массива

     studentList.map( async index => {
      try{
        const student = await User.findOne({indexNumber: index})
        if (student == null) {
          emptyStudents.push(index)
        }
      }

      catch(err){
        console.log(err)
      }
    })
  

Как я могу это сделать? Поскольку это асинхронно, я не смог найти решение для этого.

Ответ №1:

вы можете использовать карту для возврата обещаний, а затем, когда они будут завершены, за пределами карты вы можете нажать на свой массив —

 const studentPromises = studentList.map( async index => {
    return User.findOne({indexNumber: index})
})

const studentResults = await Promise.all(studentPromises)

studentResults.forEach((student) => {
    if (student == null) {
        emptyStudents.push(index)
    }
})
  

Ответ №2:

 await Promise.all(studentList.map( async index => {
  try{
    const student = await User.findOne({indexNumber: index})
    if (student == null) {
      emptyStudents.push(index)
    }
  }
}))
  

Комментарии:

1. Это правильно, но небольшое объяснение было бы неплохо, особенно потому, что обещания могут быть трудными для понимания поначалу.

Ответ №3:

Вы можете попытаться обернуть свое отображение массива с Promise помощью (и запустить его внутри async функции):

 await new Promise((resolve, reject) => {
  studentList.map( async index => {
    try{
      const student = await User.findOne({indexNumber: index})
      if (student == null) {
        emptyStudents.push(index)
      }
      if (studentList.length - 1 === index) {
        resolve();
      }
    }

    catch(err) {
      console.log(err);
      reject(err);
    }
  })
});

// YOUR CODE HERE