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

如何存储Promise决议后的值并使用?Uniswap交互封装类实现问题

因为UniswapTokenPriceFetcher.build()是异步静态方法,返回值为包装了类实例的Promise,只要在使用实例前等待该Promise决议即可,不同使用场景的实现方式如下:

场景1:当前文件内使用

直接在async函数内用await调用build方法,拿到的就是完全初始化完成的类实例:

const UniswapTokenPriceFetcher = require('./你的类文件路径')

// 所有异步逻辑放在async函数内
async function run() {
  // 传入两个Token的合约地址,等待实例初始化完成
  const fetcher = await UniswapTokenPriceFetcher.build('0xToken1地址', '0xToken2地址')
  // 后续直接调用实例方法即可,无需再等待
  console.log('执行价:', fetcher.getExecutionPrice6d())
  console.log('下一中签价:', fetcher.getNextMidPrice6d())
}

run().catch(err => console.error('初始化失败:', err))
场景2:实例需要导出给其他文件复用

由于CommonJS模块导出为同步逻辑,无法直接导出异步生成的实例,可选用以下两种方案:

方案A:导出初始化Promise,所有引用方共用实例

在类定义文件末尾直接导出初始化Promise:

// 你的类文件末尾,替换原有module.exports
const DAI_ADDR = '0x6B175474E89094C44Da98b954EedeAC495271d0F'
const WETH_ADDR = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'
// 导出初始化Promise,全局只会初始化一次
module.exports = UniswapTokenPriceFetcher.build(DAI_ADDR, WETH_ADDR)

其他业务文件导入后await即可使用:

const fetcherPromise = require('./你的类文件路径')

async function yourBusiness() {
  const fetcher = await fetcherPromise
  // 直接调用实例方法
  console.log(fetcher.getExecutionPrice6d())
}

方案B:应用启动阶段预初始化

如果是Node服务类项目,可以在入口文件先完成所有异步依赖初始化,再启动业务逻辑:

// 项目入口文件app.js
const UniswapTokenPriceFetcher = require('./你的类文件路径')

async function initApp() {
  // 先完成实例初始化
  const priceFetcher = await UniswapTokenPriceFetcher.build('0xToken1', '0xToken2')
  // 挂载到全局对象,或者作为参数传入业务模块
  global.priceFetcher = priceFetcher
  // 再启动业务逻辑
  require('./业务模块')()
}

initApp().catch(err => {
  console.error('应用初始化失败', err)
  process.exit(1)
})
额外注意

你当前代码中导入@uniswap/sdk时多写了拼写错误的冗余变量TokenAmoun,可以删除避免编译警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:03