JavaScript中如何将async函数内的变量传入其他函数中使用
你遇到的问题本质有两个:
lblock是block()函数内部的局部变量,函数外部默认无法直接访问block()是异步函数,调用后会立即返回,后续的pcsfactoryC.events.PairCreated执行时,block()里的区块查询逻辑还没完成,lblock还没被计算出来,就算提升变量作用域也会拿到空值。
方案1:把依赖lblock的逻辑整合到异步函数内部(最简洁)
直接把事件初始化逻辑放到异步函数里,等区块查询完成后再执行:
async function initBlockAndListener() { let getBlock = await web3.eth.getBlock('latest'); console.log(getBlock['number']); let lblock = getBlock['number'] - 8; console.log(lblock); // 区块计算完成后再初始化事件监听 pcsfactoryC.events.PairCreated({ fromBlock: lblock }) } initBlockAndListener();
方案2:拆分逻辑,通过返回值传递lblock
如果需要把区块计算和事件监听的逻辑拆分,可以把lblock作为异步函数的返回值,等待异步执行完成后再使用:
// 单独封装区块计算逻辑 async function getLBlock() { let getBlock = await web3.eth.getBlock('latest'); return getBlock['number'] - 8; } // 调用方式1:async自执行函数包裹 (async () => { const lblock = await getLBlock(); pcsfactoryC.events.PairCreated({ fromBlock: lblock }) })() // 调用方式2:使用.then链式调用 getLBlock().then(lblock => { pcsfactoryC.events.PairCreated({ fromBlock: lblock }) })
注意不要直接把lblock定义为全局变量然后直接在外部使用,异步逻辑执行完成前变量还是undefined,必须等待异步查询完成后再使用lblock。
内容的提问来源于stack exchange,提问作者everything is wrong
相关产品推荐
相关产品推荐

