【问题标题】:How to incorporate continiously over a loop and querying of blockchain data in javascript如何在循环中连续合并并在 javascript 中查询区块链数据
【发布时间】:2021-12-26 08:15:27
【问题描述】:

我是 javascript 新手,正在尝试查询一些区块链数据。我只查询一次就可以成功查询数据。 但我想持续这样做。

当我使用 while 循环 来持续运行查询时,它没有检索到任何数据。

我尝试使用范围为 100 的 for 循环,发现它似乎要等到找到所有 100 个数据点后才返回。

我假设它与我的 while 循环执行类似的操作,因此由于其无限性质而不会返回任何内容。我已经在 python 中完成了这个,但似乎有 javascript 的问题。

我的代码如下。

const { LCDClient } = require('@terra-money/terra.js');

const terra = new LCDClient({
  //URL: 'https://bombay-lcd.terra.dev',
  //chainID: 'bombay-12',
  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}}}}}; 


while (true) {
    terra.wasm.contractQuery(pair_address, query_msg).then(result => {
    console.log(result);
    })
} 

【问题讨论】:

    标签: javascript asynchronous infinite-loop


    【解决方案1】:

    javascript 运行时是一个线程, 它有一个事件循环,它将按以下顺序执行多个队列:

    • 调用堆栈
    • 宏任务
    • 微任务

    当您处于无限while循环中时,代码执行将永远不会*终止调用堆栈执行并进入下一步。

    promise 监听器(thens)的执行在微任务队列中。所以它永远不会到达那里。

    这一切都是因为 javascript 运行时是单线程的。

    你不应该使用while(true),循环,即使在其他语言上, 它将无限运行 您的 CPU 核心之一

    如果您想轮询数据源以进行更改,我建议使用 setInterval() 而不是 while(true)

    setInterval( () => {
    terra.wasm.contractQuery(pair_address, query_msg).then(result => {
        console.log(result);
        });
    }, 5000);
        
    

    【讨论】:

    • 成功了!非常感谢!
    • @thinkandscrip 不客气,兄弟,如果对您有帮助,您可以接受并投票有用的答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2013-05-30
    相关资源
    最近更新 更多