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

Stella981
• 阅读 857

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

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

测试代码:

setImmediate(function(){
    console.log("setImmediate");
    setImmediate(function(){
        console.log("setImmediate-setImmediate");
    });
    setTimeout(function(){
        console.log("setImmediate-setTimeout");
    });
    process.nextTick(function(){
        console.log("setImmediate-nextTick");
    });
});
setTimeout(function(){
    console.log("setTimeout");
    setTimeout(function(){
        console.log("setTimeout-setTimeout");
    });
    setImmediate(function(){
        console.log("setTimeout-setImmediate");
    });
    process.nextTick(function(){
        console.log("setTimeout-nextTick");
    });
});
process.nextTick(function(){
    console.log("nextTick");
    setImmediate(function(){
        console.log("nextTick-setImmediate");
    });
    setTimeout(function(){
        console.log("nextTick-setTimeout");
    });
    process.nextTick(function(){
        console.log("nextTick-nextTick");
    });
});

结果如下: 

nextTick
nextTick-nextTick
setTimeout
nextTick-setTimeout
setTimeout-nextTick
setImmediate
nextTick-setImmediate
setTimeout-setImmediate
setImmediate-nextTick
setTimeout-setTimeout
setImmediate-setTimeout
setImmediate-setImmediate

解析:

// 第一圈
nextTick //优先执行微任务
nextTick-nextTick //优先执行微任务,直到完成所有微任务
setTimeout //接下来执行到时间的定时任务
nextTick-setTimeout //直到完成所有定时任务
setTimeout-nextTick //完成所有定时任务,后才会执行完所有新增的微任务
setImmediate  //最后执行宏任务
nextTick-setImmediate //直到完成所有宏任务
setTimeout-setImmediate //直到完成所有宏任务
// 第二圈
setImmediate-nextTick //优先执行微任务
setTimeout-setTimeout //接下来执行到时间的定时任务
setImmediate-setTimeout //直到完成所有定时任务
setImmediate-setImmediate //最后执行宏任务
点赞
收藏
评论区
推荐文章
Souleigh ✨ Souleigh ✨
3年前
JavaScript 和 Node.js 中事件循环
1.JavaScript中事件循环可以参考《JavaScript忍者秘籍第二版》第十三章,讲解的很好。JavaScript中事件循环,主要就在理解宏任务和微任务这两种异步任务。宏任务(macrotask):setTimeOut、setInterval、setImmediate、I/O、各种callback、UI渲染、messageCh
晴空闲云 晴空闲云
3年前
JavaScript中MutationObServer监听DOM元素详解
DOM的MutationObServer接口,可以在DOM被修改时异步执行回调函数,我的理解就是可以监听DOM修改。基本使用可以通过MutationObserver构造函数实例化,参数是一个回调函数。jsletobservernewMutationObserver(()console.log("change"));console.log(obs
菜园前端 菜园前端
1年前
什么是JavaScript异步模式
什么是异步模式?不会等待当前任务执行完毕,才会去执行下一个任务,这就是异步模式(Asynchronous)。开启异步后,就会跳过本任务,开始执行下一个任务,后续的逻辑一般会通过回调函数的方式定义。异步模式执行中,涉及到调用栈(Callstack)、消息队列
Stella981 Stella981
3年前
JS微任务 宏任务,Promise、setTimeout、setImmediate运行顺序实测
结论如下1.虽然理论上应当先运行Promise,再运行setTimeout。但是由于历史版本或使用polyfill,使得Promise未必优先运行。2.setImmediate未必比setTimeout早运行3.在最新浏览器中Promise会早于事件冒泡运行,在设计框架时应考虑这一情况以下是实测情况\
Stella981 Stella981
3年前
AVIOInterruptCB结构体分析
1AVIOInterruptCB结构体定义在/usr/include/libavformat/avio.h中有如下的结构体定义,根据头文件中的注释:这是一个回调函数和参数的结构体。有些函数是在阻塞的,用这个回调函数来检查是否中断这个阻塞函数,如果回调函数返回1,那么这个正在阻塞的操作将被中止。那么就用这个结构体里的参数opaque来回调其中的callb
Wesley13 Wesley13
3年前
PHP之定时任务(绝对实用)
在工作中经常会用到定时任务,除了在js中有定时器这个玩意可以用于前端页面的定时任务;那么后端PHP如何设置定时任务呢?一.如下是javascript中使用setTimeout和setInterval设置定时任务:1setTimeout(function(){2console.log('timeout');
Stella981 Stella981
3年前
JavaScript回调函数的高手指南
摘要:本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。回调函数是每个前端程序员都应该知道的概念之一。回调可用于数组、计时器函数、promise、事件处理中。本文将会解释回调函数的概念,同时帮你区分两种回调:同步和异步。1.回调函数首先写一个向人打招呼的函数。只需要创建一个接受name参数的函数gree
Stella981 Stella981
3年前
ES6 Promise 对象扯谈
newPromise(/executor/function(resolve,reject){...});Promise的构造函数接收一个函数作为参数,函数里面传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来
Stella981 Stella981
3年前
ES6 Promise
Promisepromise是异步编程的一种解决方案1什么是异步?异步模式,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。"异步模式"非常重要。在浏
京东云开发者 京东云开发者
12个月前
解析$nextTick魔力,为啥大家都爱它?
1.为什么需要使用$nextTick?首先我们来看看官方对于$nextTick的定义:在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM。由于vue的试图渲染是异步的,生命周期的created()钩子函数进行的DO