javascriptmappromises在其中

我有这个代码:

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

console.log("awesome");

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

回答

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

而且,.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);
});

如果,您真正想要做的是串行运行异步操作,一个接一个,然后for在包含async函数中使用常规循环,因为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);


以上是javascriptmappromises在其中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>