Разница между методами process.nextTick () и setImmediate ()
Чтобы понять разницу между методами process.nextTick () и setImmediate (), нам сначала нужно понять работу цикла событий Node.js.
Что такое цикл событий Node.js?
Поскольку JavaScript является однопоточным, то есть одновременно выполняет только один процесс, именно цикл событий позволяет Node.js выполнять неблокирующие операции ввода-вывода.
Работа цикла событий?
В начале программы JavaScript инициализируется цикл событий. В цикле событий выполняется несколько операций. Ниже приведена последовательность, в которой разные они выполняются за одну итерацию цикла событий. Эти операции обрабатываются в очереди.
timers–>pending callbacks–>idle,prepare–>connections(poll,data,etc)–>check–>close callbacks
Понимание метода process.nextTick (): всякий раз, когда инициализируется новая очередь операций, мы можем рассматривать ее как новый тик . Метод process.nextTick () добавляет функцию обратного вызова в начало следующей очереди событий. Следует отметить, что в начале программы метод process.nextTick () вызывается в первый раз перед обработкой цикла событий.
Синтаксис:
process.nextTick (обратный вызов);
Понимание метода setImmdeiate (): всякий раз, когда мы вызываем метод setImmediate (), его функция обратного вызова помещается в фазу проверки следующей очереди событий. Здесь следует отметить небольшую деталь: метод setImmediate () вызывается на этапе опроса, а его функции обратного вызова вызываются на этапе проверки .
Синтаксис:
setImmediate (обратный вызов);
Пример:
setImmediate( function A() { console.log( "1st immediate" ); }); setImmediate( function B() { console.log( "2nd immediate" ); }); process.nextTick( function C() { console.log( "1st process" ); }); process.nextTick( function D() { console.log( "2nd process" ); }); // First event queue ends here console.log( "program started" ); |
Для указанной выше программы очереди событий инициализируются следующим образом:
- В первой очереди событий печатается только «программа запущена».
- Затем запускается вторая очередь событий, и функция C, т.е. обратный вызов метода process.nextTick (), помещается в начало очереди событий. C выполняется, и очередь заканчивается.
- Затем предыдущая очередь событий завершается, а третья очередь событий инициализируется обратным вызовом D. Затем функция обратного вызова A метода setImmdeiate () помещается в, за которым следует B.
Теперь третья очередь событий выглядит так:DAB
Теперь функции D, A, B выполняются в том порядке, в котором они присутствуют в очереди.
Выход: