Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Как остановить бесконечный цикл (https://javascript.ru/forum/node-js-io-js/79696-kak-ostanovit-beskonechnyjj-cikl.html)

Telnet 10.03.2020 20:49

Как остановить бесконечный цикл
 
Есть такой кусок кода
let run = true
while (run){
   await page.waitFor(1000);
   timer++;
   console.log('timer',timer);
   //тут необходимо как то отследить пользовательский ввод и если он произошел то run = false;
   if(input == true){
        run = false;
   }
}

Как мне сделать так что б скажем по нажатию на Enter или Esc
run = false;
и цикл бы останавливался
Ctrl + C не подходит так как он полностью тушит программу, а мне бы хотелось только выйти из этого цикла

Nexus 10.03.2020 23:42

https://developer.mozilla.org/ru/doc...atements/break
https://learn.javascript.ru/keyboard-events

Telnet 11.03.2020 19:15

Таймер работает и каждую секунду выводит сколько уже прошло.
Но после запуска вообще перестает реагировать на любые кнопки с клавиатуры, даже Ctrl + C не срабатывает, помогает только перезагрузка консоли.

let keypress = require('keypress');
let run = true;
let timer = 0;

// make `process.stdin` begin emitting "keypress" events
keypress(process.stdin);
 
// listen for the "keypress" event
process.stdin.on('keypress', function (ch, key) {
  console.log('got "keypress"', key);
});
 
process.stdin.setRawMode(true);
process.stdin.resume();

const msleep = (milliSeconds) =>
    Atomics.wait(
        new Int32Array(new SharedArrayBuffer(4)),
        0, 0, milliSeconds
    )
;

while (run){
    msleep(1000);
    timer++;
    console.log('timer',timer);
}

Telnet 14.03.2020 20:29

вот пример бесконечного цикла не блокирующего Event loop
Выход из цикла while по нажатию на кнопку Esc
Выход из программы по нажатию по Ctrl + c

const readline = require('readline');
const sleep = require('await-sleep');
let run = true;
let timer = 0;

readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);

process.stdin.on('keypress', (str, key) => {
    console.log(str, key, run);
    // Conditions on key
    if(key.name == 'escape'){
        run = false;
    }  
    if(key.name == 'c' && key.ctrl == true){
        process.exit(1);
    }
})

async function init(){
    while (run){
        await sleep(1000);
        timer++;
        console.log('timer',timer);
    }
}
init()


Часовой пояс GMT +3, время: 04:16.