如何在JavaScript中实现循环持续查询区块链数据
问题根因
JavaScript是单线程事件驱动模型,所有同步代码会优先在主线程执行,异步操作(比如你的contractQuery网络请求)的回调会被放到任务队列,必须等主线程的同步代码全部执行完成后才会被调度执行。
- 你写的
while(true)是无限同步循环,会一直占用主线程,永远不会执行到.then()里的回调,所以看不到任何输出 - 100次的for循环也是同理,必须等for循环的同步代码全部执行完,才会依次处理已经返回的请求回调,所以你会看到结果是批量一次性出来的
解决方案1:setInterval定时查询
如果需要固定间隔持续发起查询,直接用全局的setInterval方法即可,示例代码:
const { LCDClient } = require('@terra-money/terra.js'); const terra = new LCDClient({ URL: 'https://lcd.terra.dev', chainID: 'columbus-5' }); const contract = 'terra1a8k3jyv3wf6k3zngza5h6srrxcckdf7zv90p6u'; const pair_address = 'terra19l0hnypxzdrp76jdyc2tjd3yexwmhz3es4uwvz'; const query_msg = {"simulation": {"offer_asset": {"amount": "1", "info": {"token": {"contract_addr": contract}}}}}; // 每1000毫秒(1秒)发起一次查询,间隔可以自己调整 setInterval(async () => { try { const result = await terra.wasm.contractQuery(pair_address, query_msg); console.log(result); } catch (err) { // 捕获查询报错,避免进程崩溃 console.error('查询失败:', err); } }, 1000)
解决方案2:等待上一次查询完成后再发起下一次
如果担心网络波动导致多个请求堆积,可以用递归的方式,上一次查询不管成功失败,完成后再发起下一次:
const { LCDClient } = require('@terra-money/terra.js'); const terra = new LCDClient({ URL: 'https://lcd.terra.dev', chainID: 'columbus-5' }); const contract = 'terra1a8k3jyv3wf6k3zngza5h6srrxcckdf7zv90p6u'; const pair_address = 'terra19l0hnypxzdrp76jdyc2tjd3yexwmhz3es4uwvz'; const query_msg = {"simulation": {"offer_asset": {"amount": "1", "info": {"token": {"contract_addr": contract}}}}}; // 定义查询函数 async function runQuery() { try { const result = await terra.wasm.contractQuery(pair_address, query_msg); console.log(result); } catch (err) { console.error('查询失败:', err); } finally { // 每次查询完成后等待1秒,再发起下一次,间隔可调整 setTimeout(runQuery, 1000) } } // 启动查询 runQuery()
内容的提问来源于stack exchange,提问作者thinkandscript
相关产品推荐
相关产品推荐

