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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:08