Каков порядок выполнения узла в этом примере - PullRequest
2 голосов
/ 29 мая 2020

Типичным примером представления функциональности функции setImmediate в Node JS является следующий код

console.log('1');
setImmediate(() => console.log('2'));
console.log('3');

, который оценивается как

1
3
2

Насколько мне известно, обратные вызовы setImmediate выполняется во время фазы check события l oop

node js event loop

Однако я не понимаю, где здесь уместна выборка новой последовательной инструкции? Гарантируем ли мы, что Node будет извлекать и выполнять console.log('3') ПЕРЕД выполнением фазы проверки и, следовательно, печатать 3 перед 2? Если да - сколько таких инструкций выполнит узел, прежде чем достигнет фазы check?

1 Ответ

4 голосов
/ 29 мая 2020

Однако я не понимаю, где здесь уместно получение новых последовательных инструкций? мы уже выполняем их!

  1. Определено, что ваш код должен выполняться
  2. Запуск вашего кода (все 3 строки)
  3. Событие l oop вводится и проверяет, что еще нужно сделать
  4. Определено, что обратный вызов должен выполняться
  5. Выполняется обратный вызов (все «1 строки»)
  6. .. .

Гарантируем ли мы, что Node получит и выполнит console.log ('3') ПЕРЕД выполнением фазы проверки и, следовательно, напечатает 3 перед 2?

Да.

Если да - сколько таких инструкций узел выполнит до достижения фазы проверки?

Бесконечно много.

JavaScript - одиночный -threaded *, и ничто не может вытеснить ваш код (кроме Ctrl + C).

* 10 34 * Итак, следующий код будет выводить
3 всю вечность, а никогда до 2**:
console.log('1');
setImmediate(() => console.log('2'));
while (true) {
  console.log('3');
}
1
3
3
3
3
... (forever)

Точно так же следующий код будет на всю вечность напечатайте 2A и никогда не доберетесь до 2B:

console.log('1');
setImmediate(() => {
  while (true) {
    console.log('2A');
  }
});
setImmediate(() => console.log('2B'));
console.log('3');
1
3
2A
2A
2A
2A
... (forever)

(То же самое применимо, если вы переместите setImmediate(() => console.log('2B')); внутри первого обратного вызова вместо того, чтобы помещать его под ним .)

*: Да, есть рабочие потоки в node.js и сервисные воркеры в браузере, но они живут в своих собственных средах.

* *: ... потребляя 100% одного ядра ЦП в процессе и не реагируя на какие-либо события или сигналы, поэтому рассматривайте это как пример интереса только c академии, а не того, что вы когда-либо написали бы в реальном коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...