setImmediate,setTimeout,nextTick 区别是什么啊,为什么执行结果是1,4,3,2
发布于 11 年前 作者 nodehugo 16283 次浏览 最后一次编辑是 8 年前

console.log(‘1’);

setImmediate(function () { console.log(‘2’); });

setTimeout(function () { console.log(‘3’); },0);

process.nextTick(function () { console.log(‘4’); });

2 回复

基本上弄明白了,简单的说一下我了解的。 1.先输出1是没有质疑的,因为输出1的语句是event queue中的第一个任务。 2.要了解后面的顺序,需要了解setImmediate和nextTick的区别。0.8以前是没有setImmediate,而且nextTick的实现也进行了修改。现在,nextTick的解释:if your JavaScript code calls process.nextTick, then the callback will fire as soon as the code runs to completion, but before going back to the event loop. The race is over, and all is good.而setImmediate执行于下一个event loop,给其他的io事件一个执行的机会,而nextTick虽然也会异步执行,但是不会给其他io事件执行的任何机会,会在本次event loop执行完后

f = function(b) { console.log(b); if(b==1000){ return; } return process.nextTick(function() { return f(b + 1); }); };

setImmediate(function () { console.log(’------------------------------------’); });

f(1);

下面的例子中你会发现会打印1000个数字后,才会打印-------,为什么我会设置1000呢?如果过了1000会报错,因为process.maxTickDepth()的缺省值是1000,如果超过会报exceed callback stack。官方认为在递归中用process.nextTick会造成饥饿event loop,因为nextTick没有给其他异步事件执行的机会,递归中推荐用setImmediate 3.setTimeout(callback,0)会将事件放到下一个事件循环中,所以也会比nextTick慢执行,但是和setImmediate到底谁快,似乎是不确定的,我运行是1-4-3-2,而你是1-4-2-3.所以我认为这两个方法执行先后是不定的

参考 http://howtonode.org/understanding-process-next-tick

http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/

http://freewind.me/blog/20120516/926.html

回到顶部