下面的循环调用一个异步函数,这里是使用 web3 的智能合约交互。我想通过调用 balanceOf() 来获取令牌数组的余额,然后使用附加的 usdrate 将其转换。对于并行处理,我使用 Promise.all。显然,Promise.all() 下的具有访问权限 [I % currency.length] 的函数不起作用,因为无法保证排序结果。
我的问题是,我怎样才能将金额与附加到代币的正确 usdrate 相乘并仍然使用 Promise.all?
currencies = [{
contract: token1,
usdrate: 0.5
},
{
contract: token2,
usdrate: 1.0
},
{
contract: token3,
usdrate: 1.05
},
{
contract: token4,
usdrate: 1.10
},
{
contract: token5,
usdrate: 1.40
},
{
contract: token6,
usdrate: 1.0
},
{
contract: token7,
usdrate: 1.0
}
];
}
async function getUsdWealthAsync(addresses) {
var totalWealth = 0;
var amountPromises = [];
for (var j = 0; j < currencies.length; j++) {
for (var i = 0; i < addresses.length; i++) {
amountPromises.push(currencies[j].contract.methods.balanceOf(addresses[i]).call());
}
}
await Promise.all(amountPromises).then(function(amounts) {
for (var i = 0; i < amounts.length; i++) {
amounts[i] = Number.parseInt(amounts[i]);
totalWealth += (amounts[i] / 100) * currencies[i % currencies.length].usdrate;
}
})
return totalWealth;
}