Подтвердить что ты не робот

Существуют ли существенные различия между циклом событий браузера Chrome и циклом событий узла?

Филипп Робертс делает блестящую работу, объясняя цикл событий браузера здесь, предоставляя четкое объяснение между стеком вызовов, циклом событий, очередью задач, а затем "внешними" потоками как webapis. Мой вопрос заключается в том, чтобы эти параллельные эквивалентные компоненты в цикле событий Node и называются они в основном одинаковыми. То есть, когда я делаю вызов с помощью Node файлов и библиотек ввода/вывода в Интернете, это те вещи, которые происходят за пределами стека, чьи обратные вызовы поставлены в очередь в очереди задач?

4b9b3361

Ответ 1

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

Да, конечно; они асинхронные, как Ajax и setTimeout асинхронные. Они выполняют некоторую операцию за пределами стека вызовов, а когда они заканчивают эту операцию, они добавляют событие в очередь для обработки в цикле событий.

Node API предоставляет своего рода асинхронный запрет, setImmediate. Для этой функции "некоторая операция", о которой я упоминал выше, это "ничего не делать", после чего элемент немедленно добавляется в конец очереди событий.

Существует более мощный process.nextTick, который добавляет событие в начало очереди событий, эффективно сокращая строки и заставляя все остальные события в очереди ждать. Если вызываться рекурсивно, это может вызвать длительную задержку для других событий (до достижения maxTickDepth).

Ответ 2

Оба совершенно разные. Цикл событий браузера не зависит от операций ввода-вывода. Но цикл событий Node js зависит от операций ввода-вывода. Здесь основная цель цикла событий Node js состоит в том, чтобы отделить основной процесс и попытаться выполнить операции ввода-вывода и другие API таймера асинхронно.

И еще одно отличие состоит в том, что у нас нет функции setImmediate() в браузере. Разница между setTimeout() и setImmediate() заключается в том, что функция обратного вызова setTimeout() будет выполняться после заданного минимального порогового значения в миллисекундах. Но в setImmediate() после выполнения любой операции ввода-вывода, если конкретный код задан внутри setImmediate(), он будет выполнен первым.

Потому что обычно

setTimeout(() => {
    //some process
}, 0);

и

setImmediate(() => {
    //some process
});

одинаковы, и мы не можем предсказать, что будет выполнено первым. Но в перспективе Node js под механизмом цикла событий nodejs, если оба они присутствуют при обратном вызове любой операции ввода-вывода, setImmediate() будет выполняться первым. так,

let fs = require('fs');
fs.readFile('/file/path', () => {
   setTimeout(() => {
      console.log('1');
   }, 0);
   setImmediate(() => {
      console.log('2');
   });
});

Вывод для приведенного выше кода будет,

2
1