【问题标题】:javascript map promises inside themjavascript map promises里面
【发布时间】:2021-03-06 05:30:34
【问题描述】:

我有这个代码:

signers.map(async (signer, tx) => {
   const address = await signer.getAddress();
   console.log(address);
   return { account: address, amount: 1 }
})

console.log("awesome");

问题是awesome 先打印出来。我如何确保在map 中解决所有承诺之前,它不会到达awesome。最干净的方式将不胜感激。

【问题讨论】:

  • 添加您的解决方案作为答案,然后(在冷却期后)将其标记为已接受。

标签: javascript asynchronous promise


【解决方案1】:

所有异步函数都会返回一个 Promise,该 Promise 在函数主体完成时解析,或者在发生异常时拒绝。

而且,.map() 根本不是 async-aware。它不会暂停循环等待承诺。因此,您正在同时运行所有异步操作,signers.map() 返回一组承诺。如果您想知道它们何时全部完成并获得所有这些承诺的结果,您需要在该承诺数组上使用Promise.all()

let promises = signers.map(async (signer, tx) => {
   const address = await signer.getAddress();
   console.log(address);
   return { account: address, amount: 1 }
});

Promise.all(promises).then(results => {
    console.log("awesome");
    console.log(results);
}).catch(err => {
    console.log(err);
});

如果,您真正想做的是一个接一个地串行运行异步操作,然后在包含async 的函数中使用常规的for 循环,因为for 循环是async-aware 和将暂停循环等待await

let addresses = [];
for (let signer of signers) {    
   const address = await signer.getAddress();
   console.log(address);
   addresses.push({ account: address, amount: 1 });
}
console.log(addresses);

【讨论】:

  • @NikaKurashvili - 这回答了你的问题吗?
【解决方案2】:

请注意,没有什么可以阻止您等待Promise.all,因为它只是对结果的承诺;

const promises = signers.map(async (signer, tx) => {
   const address = await signer.getAddress();
   console.log(address);
   return { account: address, amount: 1 }
});

const results = await Promise.all(promises);

console.log("awesome");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2020-11-02
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多