Как я могу использовать array.push на асинхронный цикл? - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь вставить цикл в асинхронную функцию, но данные, введенные в этот массив, не сохраняются после завершения цикла. Что бы я делал неправильно?


    for (cont = 0; cont < 3; cont += 1) {
      console.log(cont);

      sqs.receiveMessage(paramsReceiveMessage, (err, data) => {
        if (err) {
          console.log('Receive Error', err);
        } else if (data.Messages) {
          const [{ MD5OfBody }] = data.Messages;
          sqsMessages.push(MD5OfBody);

          console.log(sqsMessages);
        }
      });
    }

    const result = await Promise.all(sqsMessages);

    console.log(result);

    return result;

Мой ответ:

2019-11-04T14:35:12.219Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    0
2019-11-04T14:35:12.221Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    1
2019-11-04T14:35:12.223Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    2
2019-11-04T14:35:12.224Z    f00e1408-3ec6-4290-914a-eae4efb23939    INFO    []

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Ваша функция обратного вызова в sqs.receiveMessage() все еще активна, когда код позже достигает await Promise.all(), поэтому ваш массив sqlMessages все еще пуст. Вам нужно дождаться выполнения обещаний в этом массиве.

Другими словами, создайте массив с обещаниями, а затем дождитесь их. Как то так:

const promises = [];

for (cont = 0; cont < 3; cont += 1) {
    console.log(cont);

    promises.push(new Promise((resolve, reject) => {

        sqs.receiveMessage(paramsReceiveMessage, (err, data) => {
            if (err) {
                console.log('Receive Error', err);
                reject(err);
            } else if (data.Messages) {
                const [{ MD5OfBody }] = data.Messages;
                sqsMessages.push(MD5OfBody);
                console.log(sqsMessages);
                resolve(MD5OfBody);
            }
        });
    }));
}

const result = await Promise.all(promises);

console.log(result);
0 голосов
/ 04 ноября 2019

Глядя на ваш код, я ожидал бы, что второй-последний оператор (console.log (result);) будет выполняться раньше всего - и это означает, что консольный результат будет пустым.

Если остальныекод верен (что я не могу точно сказать), вы должны иметь возможность console.log результат (последняя строка кода показано) в месте, где возвращается возвращается.

псевдокод:

containing function(){
    console.log(yourCodeInFunction());
}

Эта консоль должна дать результат, потому что она не будет работать, пока ваши сообщения не будут получены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...