网站运行费用预算,茶文化网站建设内容,安徽省建设信息网站,网站开发的技术栈1.定时器 setTimeout()和setInterval()与浏览器中的API是一致的#xff0c;定时器的问题在于#xff0c;他并非精确的#xff08;在容忍范围内#xff09;。尽管事件循环十分快#xff0c;但是如果某一次循环占用的时间较多#xff0c;那么下次循环时#xff0c;他也许已…1.定时器 setTimeout()和setInterval()与浏览器中的API是一致的定时器的问题在于他并非精确的在容忍范围内。尽管事件循环十分快但是如果某一次循环占用的时间较多那么下次循环时他也许已经超时很久了。比如通过setTimeout()设定一个任务在10毫秒后执行但是在9毫秒后有一个任务占用了5毫秒的cpu时间片再次轮到定时器执行时时间就已经过期4毫秒。 2.process.nextTick() 在未了解process.nextTick()之前很多人也许为了立即异步执行一个任务会这样调用setTimeout()来达到所需的效果 setTimeout(function () {//code}, 0); 由于事件循环自身的特点定时器的精确度不够。而事实上采用定时器需要动用红黑树创建定时器对象和迭代等操作而setTimeout(fn, 0)的方式较为浪费性能。实际上process.nextTick()方法的操作相对较为轻量。 每次调用process.nextTick()方法只会将回调函数放入队列中在下轮tick时取出执行定时器中采用红黑树的操作时间复杂度为O(lg(n)),nextTick()的时间复杂度为O(1),很明显nextTick()更加高效。 3.setImmediate() setImmediate()方法与process.nextTicl()方法十分类似都是将回调函数延迟执行。在node V0.9.1之前setImmediate()还没有实现那时候实现类似的功能主要是通过process,nextTick()来完成。 4.nextTick()和setImmediate()区别与联系 process.nextTick()中的回调函数执行的优先级要高于setImmediate().这里的原因在于事件循环对观察者的检查是有先后顺序的process.nextTick()属于idle观察者setImmediate()属于check观察者。在每一个轮循环检查中idle观察者先于I/O观察者I/O观察者先于check观察者。 在具体实现上process.nextTick()的回调函数保存在一个数组中setImmediate()的结果则是保存在链表中。在行为上process.nextTick()在每轮循环中会将该数组中的回调函数全部执行完而setImmediate()在每轮循环中执行链表中的一个回调函数。下面是例子 //加入两个nextTick()的回调函数
process.nextTick(function () {console.log(nextTick延迟执行1);
});
process.nextTick(function () {console.log(nextTick延迟执行2);
})
//加入两个setImmediate()的回调函数
setImmediate(function () {console.log(setImmediate延迟执行1);//进入下次循环process.nextTick(function () {console.log(强势插入);});
});
setImmediate(function () {console.log(setImmediate延迟执行2);
});
console.log(正常执行); 其执行结果如下 正常执行 nextTick延迟执行1 nextTick延迟执行2 setImmediate延迟执行1 setImmediate延迟执行2 强势插入 转载于:https://www.cnblogs.com/yonglin/p/7857804.html