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相关推荐

  1. 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637 https://www.jianshu.com/p/93d756db8c81 首先,请牢记2点: (1) JS是 ...

  2. Event Loop 事件循环简介

    1.Event Loop? Event Loop 其实也是在面试中经常会出现的一个题,前端程序员回答不上来是正常的,因为 Event Loop 是 C++ 实现的,实现原理和 JavaScript 没 ...

  3. node.js中对Event Loop事件循环的理解

    javascript是单线程的,所以任务的执行都需要排队,任务分为两种,一种是同步任务,一种是异步任务. 同步任务是进入主线程上排队执行的任务,上一个任务执行完了,下一个任务才会执行. 异步任务是不进 ...

  4. Event Loop事件循环机制

    转载自:阮一峰博客<JavaScript 运行机制详解:再谈Event Loop> 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个 ...

  5. node mysql 事件循环_NodeJs 的 Event loop 事件循环机制详解

    什么是事件轮询 事件循环是 Node.js 处理非阻塞 I/O 操作的机制--尽管 JavaScript 是单线程处理的--当有可能的时候,它们会把操作转移到系统内核中去. 下面的图表显示了事件循环的 ...

  6. JavaScript中的事件循环

    JavaScript是单线程单并发语言 单线程:主程序只有一个线程,即同一时间片段内其只能执行单个任务. 引发的问题: 单线程,意味着任务都需要排队,前一个任务结束,才会执行后一个任务.若前一个任务耗 ...

  7. 试图解释清楚【JavaScript Event Loop】

    本篇文章较长,让网络飞一会再看~ 本文结构 - 带着问题看这篇文章 - JS Runtime的几个概念 - Event Loop事件循环 - UI Rendering Task - 可视化:event ...

  8. html5多线程例子,javascript的单线程事件循环及多线程介绍

    前言 其实我前面文章对于改变js的执行顺序及多线程都有相关介绍!例如,我们可以用setTimeout(fn,0)改变代码执行循序,文章最后也提及了Event Loop(事件循环).同时,js的Work ...

  9. Even Loop(事件循环机制)

    1.什么是事件循环机制 Event Loop即事件循环,是解决javaScript单线程运行阻塞的一种机制. 2.为什么使用Even Loop 原因:JavaScript 是单线程的.单线程就意味着, ...

最新文章

  1. 土豆上的小霉菌引发百万人死亡和逃难,却造就全球7千万后裔
  2. Clubhouse 本土化之后干得过“顶流”抖音快手吗? | 极客视频
  3. 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...
  4. PHP 数组变量之写时复制的要点 只有数组才有的概念。
  5. Java高并发编程:定时器、互斥、同步通信技术
  6. springboot2.1.5集成finereport10.0过程中:手动安装本地jar包到maven仓库
  7. 算法描述怎么写_管件材料描述怎么写
  8. 神经网络模型遇到瓶颈?这些Tricks让你相见恨晚!
  9. Linux内核的文档管理工具:Sphinx
  10. StateListDrawable 动态更换背景
  11. 【原创】基于NIOS II的ADS1256 SPI驱动
  12. 引物设计软件primer_PCR-引物设计原则
  13. 快速更换证件照底色的方法
  14. 【OpenGL 学习笔记】第 4 篇:绘制四边形
  15. Doris入门到精通-阶段一(简介安装使用)
  16. vue2.0 在华为手机等手机自带浏览器打开白屏的问题
  17. Linux常用命令之Linux常用命令实战知识点
  18. 学习上溯造型和下溯造型 【转载一篇】
  19. excel单元格下拉选项怎么设置_Excel单元格内容这样设置才不能被修改
  20. 链圈百家,IT词话:BTA 2018先锋资源集锦(另附PPT下载)

热门文章

  1. 抢先报名丨2021云上架构与运维峰会将于11月6日在北京举办,五大精彩看点不容错过
  2. Hologres基于TPCH的性能测试介绍
  3. 云原生架构应该怎么设计?
  4. 汽车之家基于 Flink + Iceberg 的湖仓一体架构实践
  5. 这个云原生开发的痛点你遇到了吗?
  6. 欲瘦其包,必先探清其底细
  7. 《天涯明月刀》动作开发负责人:让美术hold住全场,推翻MMO的动作套路化设计
  8. Python,美国顶尖大学里最受欢迎的编程入门语言
  9. MySQL备份与恢复——基于OUTFILE /LOAD DATA 逻辑备份恢复
  10. 简述ajax的优缺点