如何在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
相关产品推荐
相关产品推荐

