NodeJs中nextTick、setTimeout、setImmediate运行顺序解析

setImmediate该方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数。

setImmediate是宏任务,优先级是比定时任务低的。除非在定时任务中。

测试代码:

1setImmediate(function(){ 2 console.log("setImmediate"); 3 setImmediate(function(){ 4 console.log("setImmediate-setImmediate"); 5 }); 6 setTimeout(function(){ 7 console.log("setImmediate-setTimeout"); 8 }); 9 process.nextTick(function(){ 10 console.log("setImmediate-nextTick"); 11 }); 12}); 13setTimeout(function(){ 14 console.log("setTimeout"); 15 setTimeout(function(){ 16 console.log("setTimeout-setTimeout"); 17 }); 18 setImmediate(function(){ 19 console.log("setTimeout-setImmediate"); 20 }); 21 process.nextTick(function(){ 22 console.log("setTimeout-nextTick"); 23 }); 24}); 25process.nextTick(function(){ 26 console.log("nextTick"); 27 setImmediate(function(){ 28 console.log("nextTick-setImmediate"); 29 }); 30 setTimeout(function(){ 31 console.log("nextTick-setTimeout"); 32 }); 33 process.nextTick(function(){ 34 console.log("nextTick-nextTick"); 35 }); 36});

结果如下: 

1nextTick 2nextTick-nextTick 3setTimeout 4nextTick-setTimeout 5setTimeout-nextTick 6setImmediate 7nextTick-setImmediate 8setTimeout-setImmediate 9setImmediate-nextTick 10setTimeout-setTimeout 11setImmediate-setTimeout 12setImmediate-setImmediate

解析:

1// 第一圈 2nextTick //优先执行微任务 3nextTick-nextTick //优先执行微任务,直到完成所有微任务 4setTimeout //接下来执行到时间的定时任务 5nextTick-setTimeout //直到完成所有定时任务 6setTimeout-nextTick //完成所有定时任务,后才会执行完所有新增的微任务 7setImmediate //最后执行宏任务 8nextTick-setImmediate //直到完成所有宏任务 9setTimeout-setImmediate //直到完成所有宏任务 10// 第二圈 11setImmediate-nextTick //优先执行微任务 12setTimeout-setTimeout //接下来执行到时间的定时任务 13setImmediate-setTimeout //直到完成所有定时任务 14setImmediate-setImmediate //最后执行宏任务
点赞
收藏

评论区

加载中...

相关推荐

JavaScript 和 Node.js 中事件循环

1.JavaScript中事件循环可以参考《JavaScript忍者秘籍第二版》第十三章,讲解的很好。JavaScript中事件循环,主要就在理解宏任务和微任务这两种异步任务。宏任务(macrotask):setTimeOut、setInterval、setImmediate、I/O、各种callback、UI渲染、messageCh

JavaScript中MutationObServer监听DOM元素详解

DOM的MutationObServer接口,可以在DOM被修改时异步执行回调函数,我的理解就是可以监听DOM修改。基本使用可以通过MutationObserver构造函数实例化,参数是一个回调函数。jsletobservernewMutationObserver(()console.log("change"));console.log(obs

什么是JavaScript异步模式

什么是异步模式?不会等待当前任务执行完毕,才会去执行下一个任务,这就是异步模式(Asynchronous)。开启异步后,就会跳过本任务,开始执行下一个任务,后续的逻辑一般会通过回调函数的方式定义。异步模式执行中,涉及到调用栈(Callstack)、消息队列

JS微任务 宏任务,Promise、setTimeout、setImmediate运行顺序实测

结论如下1.虽然理论上应当先运行Promise,再运行setTimeout。但是由于历史版本或使用polyfill,使得Promise未必优先运行。2.setImmediate未必比setTimeout早运行3.在最新浏览器中Promise会早于事件冒泡运行,在设计框架时应考虑这一情况以下是实测情况\

AVIOInterruptCB结构体分析

1AVIOInterruptCB结构体定义在/usr/include/libavformat/avio.h中有如下的结构体定义,根据头文件中的注释:这是一个回调函数和参数的结构体。有些函数是在阻塞的,用这个回调函数来检查是否中断这个阻塞函数,如果回调函数返回1,那么这个正在阻塞的操作将被中止。那么就用这个结构体里的参数opaque来回调其中的callb

PHP之定时任务(绝对实用)

在工作中经常会用到定时任务,除了在js中有定时器这个玩意可以用于前端页面的定时任务;那么后端PHP如何设置定时任务呢?一.如下是javascript中使用setTimeout和setInterval设置定时任务:1setTimeout(function(){2console.log('timeout');

NodeJs中nextTick、setTimeout、setImmediate运行顺序解析 - HelloWorld