Node.js Response.send не возвращает данные до завершения функции

Может ли кто-нибудь объяснить мне, почему приведенная ниже функция возвращается до завершения функции retrieve_s3_file()?

Клиент не получает данных от response.send ниже. Данные, возвращаемые функцией retrieve_s3_file(), верны (на основе вывода консоли), но сначала клиенту отправляется ответ без данных.

app.post("/getJobStatus", function(request, response){
    var guid = request.body.job_id;
    var to_do_list = [];
    var data_list = [];
    var completed_list = [];

axios.get(job_queue_url + "/list?guid=" + guid)
        .then(function (res){
          console.log("Response from API gateway : ");
          console.log(res.data);
          files = res.data;
          for (let i = 0; i < files.length; i++)
          {
            if (files[i] in completed_list) {continue}
            else {
              to_do_list.push(files[i]);
              completed_list.push(files[i]);
            }
          }
          response.send(retrieve_s3_file(to_do_list, guid));
        })
        .catch(function (error){
          console.log(error);
        });
Формы 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), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
13
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если retrieve_s3_files равно асинхронный, вам нужно будет дождаться разрешения промиса, прежде чем вы сможете использовать это значение. Вы можете изменить эту последнюю строку примерно так:

retrieve_s3_file(to_do_list, guid).then(val => {
    response.send(val);
}).catch(error => {
    console.log(error)
});

Я добавил метод .catch, чтобы вы могли изящно обрабатывать любые ошибки, возникающие при взаимодействии с s3.

Хорошо, спасибо, я думал, что Javascript действительно будет ждать, пока функция что-то вернет в этом случае, но я думаю, что нет.

aggie0642 22.04.2022 20:07

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