#javascript #node.js #async-await #sequelize.js
#javascript #node.js #асинхронное ожидание #sequelize.js
Вопрос:
Итак, в основном я помещаю значения в список ArrayList с именем TripsData внутри функции start, но он становится пустым, как только я выхожу из функции, поэтому я не могу превышать дальше. где trips — это просто массив [1,2,3,4]
И далее следует код…
const TripsData = []; // I need to push data in this array
await trips.forEach((trip) => {
async function start() {
const url = await TripMedia.findOne({ // i get my url here
where: { tripID: trip },
})
.then((result3) => {
const url = result3.mediaURL;
return url;
})
.catch((error) => {
console.log(error);
});
const subject = await TripDetails.findOne({ // i get my subject here
where: { tripID: trip },
})
.then((result3) => {
const subject = result3.subject;
return subject;
})
.catch((error) => {
console.log(error);
});
TripsData.push({
tripId: trip,
mediaURL: url,
subject: subject,
}); // The value is getting pushed here
}
start();
});
console.log(TripsData) // If i try to get data here its not present
Reply.push({
"locationId":location,
"locationName": dict[location],
"trips": TripsData
}) // so the value of tripsData is like [] only ... how to get data
Значения поступают в
TripsData.push({
tripId: trip,
mediaURL: url,
subject: subject,
});
Но значение вне forEach заканчивается, оно становится пустым?
Вопрос в том, почему так и как решить
Заранее благодарю вас за помощь на уровне Бога
Ответ №1:
Вы неправильно поняли код. Вторая console.log
выполняется не после function
выполнения is, а до этого, потому start
что is async
и вы не await
для этого. Это означает, что start добавляется в цикл событий и, хотя trips.forEach
он ожидается и выполняется, function
внутри он не будет ожидаться. Итак, технически, второй консольный журнал выполняется после forEach
, но до завершения любого из start
вызовов.
Комментарии:
1. даже если я сделаю Reply.push await, это не сработает. и родительская асинхронная функция для нее
Ответ №2:
В вашем коде необходимы исправления: вы определили start как асинхронную функцию, но при ее вызове не ожидали ее, и поскольку await должен вызываться только внутри асинхронной функции, вам нужно сделать обратный вызов forEach асинхронным.
await trips.forEach(async (trip) => {
async function start() {
return TripsData.push({
tripId: trip,
mediaURL: url,
subject: subject,
}); // The value is getting pushed here
}
await start();
});
Комментарии:
1. вы на полпути правы, значения остаются в TripsData после завершения forEach, он все равно становится пустым
2. мне нужно, чтобы эти TripsData были отправлены в ответ
3. вы воплощаете весь раздел кода в асинхронной функции? убедитесь, что вы это сделали