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