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

