几个定时函数

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...

https://github.com/creeperyan...

https://segmentfault.com/a/119...

posted @ 2018-12-19 01:15  xlupc  阅读(256)  评论(0编辑  收藏  举报