Node.js: process.nextTick() vs setImmediate()
Есть важное отличие между process.nextTick и setImmediate. Вызов nextTick добавляет событие в начало очереди и оно выполнится первым после завершения текущего цикла событий. setImmediate добавляет событие в конец.
Например если вы разбили большую функцию на несколько частей и в конце каждой части вызываете следующую через nextTick - то это совершенно бесполезно, поскольку никакое другое событие все равно обработано не будет, пока все части вашей функции не отработают. А вызов через setImmediate позволит втиснутся другим обработчикам
Пример
вот программа которая выполняет подсчет сложного хэша, типа блокчейна или вроде того, когда каждый последующий элемент включает в себя предыдущий.
const crypto = require('crypto');
var s='start';
var num=0;
setInterval(()=>{
num++;
console.log(`Incomming call ${num}`);
}, 1000);
function makeCB(i) {
return ()=>{
console.log(`i = ${i}`);
for (var j=0;j<1000;j++) {
var hash = crypto.createHash('sha256');
hash.update(s+i+''+j);
s=hash.digest('hex');
}
}
}
var arr=[];
for(var i=0;i<1000;i++) {
arr.push(makeCB(i));
}
function step(){
var func=arr.shift();
if (func) {
func();
process.nextTick(step);
//setImmediate(step);
}
}
step();
console.log(s);
Когда используется nextTick, события от таймера начнут обрабатываться только после завершения расчета хэша. Если setImmediate - расчет хэша не помешает обработке событий таймера.
Следствие
Использование setImmediate предпочтительнее. А использование nextTick может привести к неожиданным тормозам когда необходима параллельная обработка запросов - программа будет выглядеть как асинхронная, но фактически выполняться синхронно.