#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 добро пожаловать, братан, так что ты можешь принять и проголосовать за полезный ответ, если он тебе помог 😉