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

标签 javascript amazon-web-services asynchronous

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


    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    []

最佳答案

当代码稍后到达 await Promise.all() 时,sqs.receiveMessage() 中的回调函数仍然处于事件状态,因此您的 sqlMessages code>-array 仍然是空的。您需要等待该数组中的 promise 完成。

换句话说,创建一个包含 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);

关于javascript - 如何在异步循环上使用 array.push?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695713/

相关文章:

c# - 是否可以 "launch"一个(大)文件的副本而不等待结果?

javascript - 关于逻辑运算符&&的理解问题

JavaScript 切换按钮

amazon-web-services - 资源处理程序返回消息 : "invalid request provided: AWS::Logs::MetricFilter"

javascript - 使用 typescript 时出现不稳定的 AWS lambda 行为

java - 服务中的 Spring @Async 方法

javascript - 如何使用 Ember.run.later 实现秒表倒计时

javascript - 如何使用 ajax 加载更多 Logo ?

ubuntu - 使用 Chef 开源服务器部署带有密码的私有(private) git 存储库

c# - 在 C# 中使用 Task<List<Task>> 进行异步递归操作