JavaScript event loop事件循环 macrotask与microtask
macrotask 姑且称为宏任务,在很多上下文也被简称为task。例如:
setTimeout,
setInterval,
setImmediate,
I/O,
UI rendering.
microtask 微任务,也称job。例如:
process.nextTick,
Promise(原生),
Object.observe,
MutationObserver
备注:同时需要注意的是,在 ES 当中称 microtask 为 “jobs”。比如 ES6标准 8.4节当中的 “EnqueueJob” 意思指添加一个 microtask。
看看下面的实例:
setImmediate(function(){console.log(1); },0); setTimeout(function(){console.log(2); },0); new Promise(function(resolve){console.log(3);resolve();console.log(4); }).then(function(){console.log(5); }); console.log(6); process.nextTick(function(){console.log(7); }); console.log(8);//输出结果是3 4 6 8 7 5 2 1
看看另一题目
setTimeout(()=>{console.log('A');
},0);
var obj={func:function () {setTimeout(function () {console.log('B')},0);return new Promise(function (resolve) {console.log('C');resolve();})}
};
obj.func().then(function () {console.log('D')
});
console.log('E');
1、首先 setTimeout A 被加入到事件队列中 ==> 此时macrotasks中有[‘A’];
2、obj.func()执行时,setTimeout B 被加入到事件队列中 ==> 此时macrotasks中有[‘A’,‘B’];
3、接着return一个Promise对象,Promise 新建后立即执行 执行console.log('C'); 控制台首次打印‘C’;
4、然后,then
方法指定的回调函数,被加入到microtasks队列,将在当前脚本所有同步任务执行完才会执行。 ==> 此时microtasks中有[‘D’];
5、然后继续执行当前脚本的同步任务,故控制台第二次输出‘E’;
6、此时所有同步任务执行完毕,如上所述先检查microtasks队列,完成其中所有任务,故控制台第三次输出‘D’;
7、最后再执行macrotask的任务,并且按照入队列的时间顺序,控制台第四次输出‘A’,控制台第五次输出‘B’。
结果 C E D A B
setTimeout(function timeout () {console.log('timeout');},0);setImmediate(function immediate () {console.log('immediate');});
结果
immediate
timeout
setInterval(function timeout () {console.log('setInterval');},0);setTimeout(function timeout () {console.log('timeout');},0);setImmediate(function immediate () {console.log('immediate');});
结果:
immediate
setInterval
timeout
setInterval
setTimeout(function timeout () {console.log('timeout');},0);setInterval(function timeout () {console.log('setInterval');},0);
timeout
setInterval
另一个
setTimeout(function timeout () {console.log('timeout');
},0);setImmediate(function immediate () {console.log('immediate');
});process.nextTick(function immediate () {console.log('nickTick');
});
结果
nextTick
timeout
immediate
process.nextTick
像是一个插入的tick. 生成了一个新的周期. 说白了, 是一个插队行为.
关于micro-task和macro-task的执行顺序,可看下面这个例子(来自《深入浅出Node.js》):
//加入两个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
process.nextTick在两个setImmediate之间强行插入了。
但运行这段代码发现结果却是这样:
正常执行
nextTick延迟执行1
nextTick延迟执行2
setImmediate延迟执行1
setImmediate延迟执行2
强势插入
朴老师写那本书的时候,node最新版本为0.10.13,而我的版本是6.x
转载于:https://www.cnblogs.com/surfaces/p/10736151.html
JavaScript event loop事件循环 macrotask与microtask相关推荐
- 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?
https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...
- Event Loop 事件循环简介
1.Event Loop? Event Loop 其实也是在面试中经常会出现的一个题,前端程序员回答不上来是正常的,因为 Event Loop 是 C++ 实现的,实现原理和 JavaScript 没 ...
- node.js中对Event Loop事件循环的理解
javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...
- Event Loop事件循环机制
转载自:阮一峰博客<JavaScript 运行机制详解:再谈Event Loop> 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个 ...
- node mysql 事件循环_NodeJs 的 Event loop 事件循环机制详解
什么是事件轮询 事件循环是 Node.js 处理非阻塞 I/O 操作的机制--尽管 JavaScript 是单线程处理的--当有可能的时候,它们会把操作转移到系统内核中去. 下面的图表显示了事件循环的 ...
- JavaScript中的事件循环
JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗 ...
- 试图解释清楚【JavaScript Event Loop】
本篇文章较长,让网络飞一会再看~ 本文结构 - 带着问题看这篇文章 - JS Runtime的几个概念 - Event Loop事件循环 - UI Rendering Task - 可视化:event ...
- html5多线程例子,javascript的单线程事件循环及多线程介绍
前言 其实我前面文章对于改变js的执行顺序及多线程都有相关介绍!例如,我们可以用setTimeout(fn,0)改变代码执行循序,文章最后也提及了Event Loop(事件循环).同时,js的Work ...
- Even Loop(事件循环机制)
1.什么是事件循环机制 Event Loop即事件循环,是解决javaScript单线程运行阻塞的一种机制. 2.为什么使用Even Loop 原因:JavaScript 是单线程的.单线程就意味着, ...
最新文章
- 土豆上的小霉菌引发百万人死亡和逃难,却造就全球7千万后裔
- Clubhouse 本土化之后干得过“顶流”抖音快手吗? | 极客视频
- 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...
- PHP 数组变量之写时复制的要点 只有数组才有的概念。
- Java高并发编程:定时器、互斥、同步通信技术
- springboot2.1.5集成finereport10.0过程中:手动安装本地jar包到maven仓库
- 算法描述怎么写_管件材料描述怎么写
- 神经网络模型遇到瓶颈?这些Tricks让你相见恨晚!
- Linux内核的文档管理工具:Sphinx
- StateListDrawable 动态更换背景
- 【原创】基于NIOS II的ADS1256 SPI驱动
- 引物设计软件primer_PCR-引物设计原则
- 快速更换证件照底色的方法
- 【OpenGL 学习笔记】第 4 篇:绘制四边形
- Doris入门到精通-阶段一(简介安装使用)
- vue2.0 在华为手机等手机自带浏览器打开白屏的问题
- Linux常用命令之Linux常用命令实战知识点
- 学习上溯造型和下溯造型 【转载一篇】
- excel单元格下拉选项怎么设置_Excel单元格内容这样设置才不能被修改
- 链圈百家,IT词话:BTA 2018先锋资源集锦(另附PPT下载)