Хранить данные foreach и отправлять после foreach

let test = [];
myarray.forEach((obj) => {
  db.query('select * from table', (err, res) => {
    // can't use return res.send here bcoz its in foreach loop

    test.push(res);
  });
});

return res.send(test);

Output :
[ ]
"DATA"

Получение пустого массива сначала, но получение данных во второй раз.

Помимо явных опечаток (Array — это встроенная функция, поэтому, надеюсь, ваша переменная массива не имеет такого имени, и это forEach, а не foreach), это, вероятно, Эта проблема. Пожалуйста, смотрите ответы там.

T.J. Crowder 17.05.2022 08:27

это просто для объяснения моего кода, спасибо за ваше время, пожалуйста, помогите

Uday Chauhan 17.05.2022 08:36

Не стоит «объяснять» свой код явными ошибками, это только мешает понять вашу проблему. Еще раз: См. ответы здесь, в них описано, что не так и как это исправить. (Указывая вам на существующие ответы, которые решают проблему, помогающую является. :-))

T.J. Crowder 17.05.2022 08:45

большое спасибо :) я все еще читаю асинхронный

Uday Chauhan 17.05.2022 11:54
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
4
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что вы извлекаете данные, а не ждете их.

Вот как выполняется ваш код:

  1. Начать цикл foreach
  2. Запускать запрос на каждой итерации
  3. Завершить цикл foreach
  4. Возвращаемый массив
  5. ...
  6. Ваши запросы выполняются здесь, после отправки данных.

Цель состоит в том, чтобы перебрать каждый элемент в вашем массиве, отправить запросы, дождаться всех ответов, а затем продолжить отправку вашего ответа. Лучше всего это достигается с помощью promises и async/await. Подробнее здесь.

Вот как бы я это решил.

async function runQueries() {
    // Configure array to store all promises
    const promises = []

    // Iterate through each item (this probably takes 0.001 seconds)
    myarray.forEach(obj => {
        // Run the query and store the ongoing request in the promises array
        promises.push(new Promise((resolve, reject) => {
            db.query('select * from table', (err, res) => {
                if (err) {
                    // If there was an error, send it to reject which will be caught in the try/catch
                    return reject(err)
                }

                // Return the success response
                resolve(res)
            })
        }))
    })

    // try/catch to handle any issues.
    try {
        // wait for all ongoing requests to finish and return either a response or error
        const result = await Promise.all(promises)

        // Return the result
        res.send(result)
    } catch (err) {
        console.log(err)
        
        // Send any error instead
        res.status(500).send(err)
    }
}

РЕДАКТИРОВАТЬ 1:

Это не проверено, это просто для того, чтобы объяснить мой подход к этому типу проблем.


Обновлено еще раз:

Опечатка и завернутая в асинхронную функцию

ты спасаешь жизнь большое спасибо за твои усилия я очень ценю

Uday Chauhan 17.05.2022 11:53

Другие вопросы по теме