Почему цикл событий Node.js требует нескольких фаз?

Прочитав десятки статей и документов, описывающих цикл событий Node.js, например, предоставленный самими Node.js: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

Я просто не могу обдумать это: ПОЧЕМУ цикл обработки событий требует нескольких фаз, каждая из которых имеет свои очереди обратного вызова?

Все документы и статьи описывают фазы цикла в терминах "эта фаза делает то же самое и выполняет обратные вызовы, заданные с помощью X или Y", но в действительности никогда не объясняет, ПОЧЕМУ эти отдельные очереди необходимы в первую очередь.

Почему обратные вызовы setTimeout() или setImmediate() или замыкания сокетов должны выполняться в другой точке, чем фаза опроса, где предположительно подавляющее большинство обратных вызовов выполняется?

если очередь обратного вызова на этапе опроса исчерпана до перехода к следующему этапу, в любом случае, почему бы просто не иметь одну очередь, которая прерывается для каких-либо действий, не связанных с очередью, выполняемых на других этапах?

Ответ 1

Вероятно, эта ссылка на видео описывает лучше, чем любой другой материал об обратном вызове. Чтобы ответить на различные этапы, возьмите этот пример и попробуйте смоделировать по официальной ссылке на документ, чтобы получить лучшую картину.

setTimeout(function(){
        console.log("the first block after 3 sec.");
},3000);
console.log("Hello after 3000");
setTimeout(function(){
        console.log("the second block after 1 sec.");
},1000);
console.log("Hello after 1000");
setTimeout(function(){
        console.log("the third block after 2 sec.");
},2000);
console.log("Hello after 2000");
setTimeout(function(){
        console.log("the last block after 0 sec.");
},0);
console.log("End after 0");

Ответ 2

Вероятно, это видео ссылка описывает лучше, чем anyother материал о обратном вызове. Чтобы ответить на разные этапы, возьмите этот пример и попытайтесь смоделировать в соответствии с официальной ссылкой документа, чтобы иметь лучшую картину.

setTimeout(function(){
        console.log("the first block after 3 sec);
},3000);
console.log("Hello after 3000");

setTimeout(function(){
        console.log("the second block after 1 sec);
},1000);
console.log("Hello after 1000");
setTimeout(function(){
        console.log("the third block after 2 sec);
},2000);
console.log("Hello after 2000");
setImmediate(function(){
        console.log("the last block after 0 sec);
});
console.log("End after 0");