如何让async/await类型的getGas()函数每5秒执行一次以获取最新Gas价格
解决每5秒调用async函数获取Gas价格的问题
我来帮你搞定这个定时调用的问题!你的代码里有几个小逻辑问题导致无法正常工作,我们一步步来修正:
原代码的问题点
- 你定义的
gas是一个async函数,但从来没有调用它,所以根本不会执行任何逻辑 setTimeout的回调函数不是async函数,直接在里面用await会报错(await只能在async函数内部使用)setTimeout只会执行一次,你需要的是重复定时执行,它做不到这一点
正确实现方案
根据你的需求,我提供两种常用的实现方式,你可以根据场景选择:
方案1:使用setInterval(简单直接)
适合getGas()执行时间稳定且远小于5秒的场景,固定每5秒触发一次:
async function main() { // 先立即获取一次初始Gas价格 let gas = await getGas(); console.log('初始Gas价格:', gas); // 每5秒重复调用更新价格 const intervalId = setInterval(async () => { try { gas = await getGas(); console.log('更新后的Gas价格:', gas); } catch (err) { console.error('获取Gas价格失败:', err); } }, 5000); // 如果之后需要停止定时更新,可以调用 clearInterval(intervalId) // 其他业务代码... }
方案2:递归调用setTimeout(更安全)
如果getGas()可能因为网络等原因耗时较长,这种方式可以确保上一次请求完全完成后,再等待5秒执行下一次,避免出现多个请求重叠的情况:
async function main() { // 定义递归更新函数 async function updateGasPrice() { try { const gas = await getGas(); console.log('当前Gas价格:', gas); } catch (err) { console.error('获取Gas价格失败:', err); } finally { // 无论成功失败,5秒后再次执行更新 setTimeout(updateGasPrice, 5000); } } // 启动定时更新 await updateGasPrice(); // 其他业务代码... }
注意事项
- 记得给
getGas()加上错误捕获,避免单次请求失败导致整个定时逻辑中断 - 如果需要停止定时任务,方案1要保存
setInterval返回的ID,调用clearInterval(intervalId);方案2可以加一个开关变量控制是否继续递归
内容的提问来源于stack exchange,提问作者itzmurd4
相关产品推荐
相关产品推荐

