[英]How to add web3js contract calls to Promise.all()
我会尽我所能解释这一点,因为我对 Promise 没有太多经验,主要是使用 async/await
我正在建立一个数据库并且有这样的东西
let promises = []
for (let j = 0; j < batchSize; j++) {
let token0Address = token0Addresses[j]
let token0Contract = new web3.eth.Contract(abis.token, token0Address)
promises.push(token0Contract.methods.name().call())
}
try {
let token0Names = await Promise.all(promises)
} catch {other stuff}
我遇到的问题是某些令牌没有名称,我希望这些名称会被 try catch 块捕获。 但有时调用在它到达 try 块之前就已返回,并且无论如何都会抛出错误。
我也试过这样的事情
promises.push(() => token0Contract.methods.name().call())
但这只会让 Promise.all(promises) 返回一堆函数
我也试过
promises.push(new Promise(function(resolve, reject) {
resolve(token0Contract.methods.symbol().call())
}))
和
promises.push(new Promise(function(resolve, reject) {
token0Contract.methods.name().call(function(error, result)) {
if (error) {
reject(error)
} else {
resolve(result)
}
}
}))
如果其他人遇到此问题,请找出解决方案
let tokenNameFunctions = []
for (let j = 0; j < batchSize; j++) {
let token0Address = token0Addresses[j]
let token0Contract = new web3.eth.Contract(abis.token, token0Address)
token0NameFunctions.push(() => token0Contract.methods.name().call())
}
let tokenNames = await Promise.allSettled(tokenNameFunctions.map(e => {return f()}))
不知道这是否是处理此类问题的最佳方法,但可以正常工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.