Попытка получить значение в массиве в JS, которое находится вне функции, а функция асинхронна

#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. вы воплощаете весь раздел кода в асинхронной функции? убедитесь, что вы это сделали