You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ethers.js中解析Promise并使用合约调用返回的变量?

解决ethers.js中合约方法返回Promise无法直接使用的问题

问题的核心是:ethers.js里调用合约的name()、symbol()这类方法都是异步操作,返回的是Promise对象,而非直接的字符串结果,所以直接赋值打印会显示[object Promise]。下面给两种实用的解决方式:

方案一:使用async/await(推荐,代码更直观)

把事件回调函数改成async函数,然后在每个合约方法调用前加await,等待Promise解析出实际值:

function main(){
    console.log('Starting...')
    // 将回调函数标记为async,才能使用await
    contractBsc.on('PairCreated', async (token0, token1, pair) =>{
        const erc20Contract0 = new ethers.Contract(token0, erc20Abi, provider) 
        const erc20Contract1 = new ethers.Contract(token1, erc20Abi, provider)  
        
        // 用await等待Promise完成,拿到真实的名称/符号字符串
        const name0 = await erc20Contract0.name()
        const name1 = await erc20Contract1.name()
        const symbol0 = await erc20Contract0.symbol()
        const symbol1 = await erc20Contract1.symbol()    
        
        console.log(`Token0: ${name0}, Symbol: ${symbol0}
Token1: ${name1}, Symbol: ${symbol1}`)
        
        // 现在可以直接用这些变量做后续操作,比如存入数据库、调用其他函数等
    }) 
}
main()

方案二:使用Promise.all(并行执行,效率更高)

如果想同时触发多个异步请求(不用逐个等待),可以用Promise.all批量处理,最后在then里拿到所有解析后的值:

function main(){
    console.log('Starting...')
    contractBsc.on('PairCreated', (token0, token1, pair) =>{
        const erc20Contract0 = new ethers.Contract(token0, erc20Abi, provider) 
        const erc20Contract1 = new ethers.Contract(token1, erc20Abi, provider)  
        
        // 并行发起所有合约调用,避免串行等待浪费时间
        Promise.all([
            erc20Contract0.name(),
            erc20Contract1.name(),
            erc20Contract0.symbol(),
            erc20Contract1.symbol()
        ]).then(([name0, name1, symbol0, symbol1]) => {
            console.log(`Token0: ${name0}, Symbol: ${symbol0}
Token1: ${name1}, Symbol: ${symbol1}`)
            // 在这里使用解析后的变量
        }).catch(err => {
            // 处理可能的错误,比如合约不支持ERC20方法、网络问题等
            console.error('获取代币信息失败:', err)
        })
    }) 
}
main()

额外注意事项

  • 部分合约可能不严格遵循ERC20标准,调用name()或symbol()可能抛出错误,建议在async/await方案里加上try/catch,或者在Promise方案里保留.catch做错误处理。
  • 变量命名尽量规范,比如你代码里的erc20COntract0拼写错误,改成erc20Contract0更易维护。

内容的提问来源于stack exchange,提问作者joe joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:15:33