如何在异步循环上使用array.push?

我正在尝试在异步函数中的循环中进行推送,但是在循环结束后不会保存输入到该数组中的数据。我会怎么做?


    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    []
bbb06070241 回答:如何在异步循环上使用array.push?

当代码稍后到达sqs.receiveMessage()时,您在await Promise.all()中的回调函数仍然处于活动状态,因此您的sqlMessages数组仍然为空。您需要等待该阵列中的承诺完成。

换句话说,创建一个带有promise的数组,然后等待它们。像这样:

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);
,

查看您的代码,我希望倒数第二条语句(console.log(result);)先执行其他命令-这意味着控制台结果将为空。

如果其余代码是正确的(我不太清楚),您应该可以在返回结果的地方进行console.log结果(显示最后一行代码)。

伪代码:

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

该控制台应该给出结果,因为它只有在收到您的消息后才能运行。

本文链接:https://www.f2er.com/3165894.html

大家都在问