Существует множество способов заблокировать событие l oop. Некоторые способы блокируют его только на некоторое время (например, используя синхронный файловый ввод / вывод), а некоторые способы блокируют его навсегда.
Например, это блокирует его навсегда:
let flag = false;
setTimeout(() => {
// this callback never gets called
// because event loop is blocked
flag = true;
}, 1000);
while (!flag) {
console.log("still waiting")
}
// never get here
Проблема в том, что while()
l oop работает до тех пор, пока flag
не изменит значение. Пока l oop работает, событие l oop блокируется. Есть setTimeout()
, который хочет сработать в течение 1 секунды, но он не может фактически вызвать свой обратный вызов, пока интерпретатор не вернется к событию l oop. Но оно не вернется к событию l oop, пока не будет выполнено while()
l oop. Это тупик, который приводит к бесконечности l oop, а событие l oop постоянно блокируется.
setTimeout()
не может вызвать свой обратный вызов до тех пор, пока while
l oop не будет завершен, а while
l oop не завершится sh, пока setTimeout()
не выполнит свою перезвонить. Тупик, бесконечный l oop.
Блокирует его на время, пока все файловые операции продолжаются и вся обработка файлов:
setTimeout(() => {
// this doesn't get to run until all the synchronous file I/O
// finishes in the code below, even though the timer is set
// for only 10ms
console.log("finally got to run the timer callback");
}, 10);
let files = some array of files;
for (let file of files) {
let data = fs.readFileSync(file);
let lines = data.split("\n");
for (let line of lines) {
// do something
}
}