[英]How do i use array.push on async loop?
我正在尝试在异步 function 中的循环内推送,但循环结束后不会保存输入到该数组中的数据。 我会做错什么?
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()
中的回调 function 仍然处于活动状态,因此您的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); )在执行其他任何操作之前执行 - 这意味着控制台结果将为空。
如果代码的 rest 是正确的(我不太清楚),您应该能够在返回返回的地方控制台记录结果(显示的最后一行代码)。
伪代码:
containing function(){
console.log(yourCodeInFunction());
}
该控制台应该给出结果,因为在收到您的消息之前它不会运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.