JS проходит цикл forEach перед завершением - PullRequest
0 голосов
/ 02 июля 2019

У меня есть некоторый код в контроллере, внутри которого у меня есть цикл forEach, внутри которого есть функция, которая возвращает Promise. После того, как обещание выполнено, я могу правильно записать возвращаемый массив. Проблема в том, что javascript не ждет завершения цикла forEach, хотя контроллер не асинхронный, и я не могу понять, почему ... Я посмотрел много видео и прочитал пост, но что-то не щелкает, я думаю ... Заранее спасибо

exports.submitInv = (req, res) => {

  let status = {
    validated: [],
    repacked: []
  };

  // ...other code...

  console.log("1");
  status.validated.forEach(async invoice => {
    // repackInvoice() returns a PROMISE
    let temp = await repackInvoice(invoice);
    console.log(temp);

    console.log("2");

    temp.forEach(inv => {
      status.repacked.push(inv);
    });

    console.log("3");
  });

  console.log("4");
  console.log(status.repacked);
};

Консоль должна выглядеть следующим образом: 1, [invoice], 2, 3, 4, [... all invoices], Вместо этого я получаю: 1, 4, [], [счет], 2, 3

1 Ответ

3 голосов
/ 02 июля 2019

Вы можете попробовать это, если это работает:

exports.submitInv = (req, res) => {

  let status = {
    validated: [],
    repacked: []
  };

  // ...other code...

  console.log("1");
  status.validated.forEach(invoice => {

      const promises = [repackInvoice(invoice)];  
      Promise.all(promises)
      .then(temp => {
            temp.forEach(inv => {
                 status.repacked.push(inv);
            });
            return status;
      }).catch(err =>{
          console.log(err);
          throw new Error(err);
      })   
  });

  console.log("4");
  console.log(status.repacked);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...