Как непрерывно включать в цикл и запрашивать данные блокчейна в javascript

#javascript #asynchronous #infinite-loop

Вопрос:

Я новичок в javascript и пытаюсь запросить некоторые данные блокчейна. Я могу успешно запросить данные, выполнив всего один запрос. Но я хотел бы делать это постоянно.

Когда я использую цикл while в попытке постоянно выполнять запрос, он не извлекает никаких данных.

Я пробовал использовать цикл for с диапазоном 100 и вижу, что он, похоже, ждет, пока не будут найдены все 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 =gt; {  console.log(result);  }) }   

Ответ №1:

Среда выполнения javascript представляет собой один поток , в нем есть цикл событий, который будет выполнять несколько очередей в следующем порядке:

  • стек вызовов
  • макрозадачи
  • микрозадачи

когда вы находитесь в бесконечном цикле while, выполнение кода никогда *не завершит выполнение стека вызовов и не перейдет к следующему шагу.

слушатели выполнения обещаний (затем) находятся в очереди микрозадач. так что он никогда туда не доберется.

все это происходит из-за того, что среда выполнения javascript является однопоточной.

Вы не должны использовать while(true) цикл , даже на других языках, он будет работать бесконечно загруженным одним из ядер вашего процессора

Я рекомендую использовать setInterval() вместо while(true) , если вы хотите проверить источник данных на предмет изменений.

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

Комментарии:

1. Это сработало! Большое спасибо!

2. @thinkandscrip добро пожаловать, братан, так что ты можешь принять и проголосовать за полезный ответ, если он тебе помог 😉