#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