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中一样。

posted @ 2016-04-12 23:32  北极星空  阅读(577)  评论(0编辑  收藏  举报