window.setImmediate
该方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数。
注意: 该方法最近刚刚被微软提出, 可能不会被w3c批准成为标准, 目前只有 Internet Explorer 10实现了该方法.
该方法可以用来替代 setTimeout(0)
方法来滞后完成一些需要占用大量cpu时间的操作.下面的JavaScript可以用来兼容那些不支持setImmediate方法的浏览器:
if (!window.setImmediate) {
window.setImmediate = function(func, args){
return window.setTimeout(func, 0, args);
};
window.clearImmediate = window.clearTimeout;
}
Node中的setImmediate方法和setTimeout与之十分相似,也表示主线程执行完成后立即执行。那么他们之间的区别是什么呢?
运行下面的代码
setTimeout(function(){
console.log("setTimeout");
},0);
setImmediate(function(){
console.log("setImmediate");
});
结果是随机的,有可能setTimeout回调函数执行在前,也可能setImmediate在前。
setTimeout(() => {
setImmediate(() => {
console.log('setImmediate');
});
setTimeout(() => {
console.log('setTimeout');
}, 0);
}, 0);
总结:
- 如果两者都在主模块中调用,那么执行先后取决于进程性能,也就是随机。
- 如果两者都不在主模块调用(被一个异步操作包裹),那么
setImmediate
的回调永远先执行。
正常:
当前执行栈(A、B、C)——等待队列
当前执行栈(A、C)——等待队列——回调执行(B)
process.nextTick() and Promise
对于这两个,我们可以把它们理解成一个微任务。也就是说,它其实不属于事件循环的一部分。
那么他们是在什么时候执行呢?
不管在什么地方调用,他们都会在其所处的事件循环最后,事件循环进入下一个循环的阶段前执行。
若继续调用process.nextTick(),会阻塞CPU的后续调用。
当前执行栈(A、C)——回调执行(B)——等待队列
若想深入理解,可看看下面几篇文章:
https://nodejs.org/en/docs/gu...