Node.js学习笔记:setImmediate与process.nextTick
通过process.nextTick注册的函数在当前这个事件循环中执行的函数执行完毕后立即执行,相当于把当前的同步代码执行完毕之后,立刻执行所有的通过process.nextTick注册的函数,如果注册的是多个,那么注册的函数会依次按顺序执行完毕;通过setImmediate注册的函数在下一个事件循环中执行,如果有多个,那么回依次执行。
1 'use strict'; 2 const process=require('process'); 3 4 process.nextTick(function(){ 5 console.log('1'); 6 }); 7 8 setImmediate(function(){ 9 console.log('2'); 10 }); 11 12 process.nextTick(function(){ 13 console.log('3'); 14 }); 15 16 setImmediate(function(){ 17 console.log('4'); 18 });
执行结果是1->3->2->4,其实这段代码相当于把所有通过process.nextTick注册的函数依次执行,然后把所有通过setImmediate注册的函数依次执行:
1 (function(){ 2 console.log('1'); 3 })(); 4 5 (function(){ 6 console.log('3'); 7 })(); 8 9 (function(){ 10 console.log('2'); 11 })(); 12 13 (function(){ 14 console.log('4'); 15 })();
从中可以看到process.nextTick的执行优先级比setImmediate高。
然后我们再看下面这段代码:
1 'use strict'; 2 const process=require('process'); 3 4 process.nextTick(function(){ 5 console.log('1'); 6 }); 7 8 setImmediate(function(){ 9 console.log('2'); 10 process.nextTick(function(){ 11 console.log('3'); 12 }); 13 14 setImmediate(function(){ 15 console.log('4'); 16 }); 17 }); 18 19 process.nextTick(function(){ 20 console.log('5'); 21 }); 22 23 setImmediate(function(){ 24 console.log('6'); 25 process.nextTick(function(){ 26 console.log('7'); 27 }); 28 29 setImmediate(function(){ 30 console.log('8'); 31 }); 32 });
执行结果是1->5->2->6->3->7->4->8,通过这个结果我们可以看出,同一个同步函数执行中添加的setImmediate注册的函数会依次执行,相当于拼接在一个setImmediate中一样。同样同一个同步函数执行中添加的process.nextTick注册的函数相当于拼接在一个process.nextTick中一样。