繁体   English   中英

如何将 web3js 合约调用添加到 Promise.all()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM