什么是macrotask?什么是microtask?
在理解什么是macrotask?什么是microtask之前,我们先来看看javascript中的事件循环机制,先看如下面一段代码:
console.log(1);
setTimeout(function(){
console.log(2);
}, 0);
console.log(3);
很明显 上面运行的结果是 1,3,2;
上面代码 setTimeout的延时为0,可以理解为setTimeout为异步函数调用,这是因为javascript是单线程的,主线程拥有一个执行栈以及一个任务队列
,主线程会依次执行代码,当遇到异步函数时候,会先将该函数入栈,所有主线程函数运行完毕后再将异步函数出栈,直到所有的异步函数执行完毕即可。
Macrotasks和Microtasks
Macrotasks和Microtasks 都属于上述的异步任务中的一种,他们分别有如下API:
macrotasks: setTimeout, setInterval, setImmediate, I/O, UI rendering
microtasks: process.nextTick, Promise, MutationObserver
setTimeout的macrotask, 和 Promise的microtask 有哪些不同,先来看下代码如下:

console.log(1);
setTimeout(function(){
console.log(2);
}, 0);
Promise.resolve().then(function(){
console.log(3);
}).then(function(){
console.log(4);
});

上面的代码输出的是 1, 3, 4, 2;
如上代码可以看到,Promise的函数代码的异步任务会优先于setTimeout的延时为0的任务先执行。
原因是任务队列分为 macrotasks 和 microtasks, 而promise中的then方法的函数会被推入到microtasks队列中,而setTimeout函数会被推入到macrotasks
任务队列中,在每一次事件循环中,macrotask只会提取一个执行,而microtask会一直提取,直到microsoft队列为空为止。
也就是说如果某个microtask任务被推入到执行中,那么当主线程任务执行完成后,会循环调用该队列任务中的下一个任务来执行,直到该任务队列到最后一个任务为止。而事件循环每次只会入栈一个macrotask,主线程执行完成该任务后又会检查microtasks队列并完成里面的所有任务后再执行macrotask的任务。
Microtask的应用:
为啥要用microtask? 根据 HTML Standrad, 在每个task运行完以后,UI都会重新渲染,那么在microtask中就完成数据更新,因此当前task
结束就可以得到最新的UI了。反之:如果新建一个task来做数据更新的话,那么渲染会执行两次。

javascript中的异步 macrotask 和 microtask 简介相关推荐

  1. JavaScript中的异步、同步

    要理解JS中的异步.同步,需要先了解JS代码的执行过程和Event Loop. JavaScript代码的执行过程 程序需要执行的操作都会被放入Call Stack(A LIFO (Last In, ...

  2. Javascript中的异步

    在C#,Java中,异步方法,通常是伴随多线程,并发等术语一起出现的,比如C#中的async方法,是运行在一个线程池线程上,并且在异步方法运行完成后,有一个回调函数通知主线程. 那么由于Javascr ...

  3. JavaScript中的异步梳理(0)

    JavaScript中有大量异步操作,首先可以看看JS中什么东西会产生异步(这里先只考虑浏览器里的情况): Ajax(XMLHttpRequest) Image Tag,Script Tag,ifra ...

  4. JavaScript 中的异步:Event Loop 及其他

    写作时间 2016-09-30 异步 简单地说,JavaScript 是单线程执行的语言,但在使用中有很多异步执行的情况.异步的本质是用其他方式(相对同步)控制程序的执行顺序,这与其他语言中的多线程模 ...

  5. javascript中的异步调用,promise对象,async/await用法

    原生javascript中的的回调函数 即callback 就是通过回调函数来通知主程序 对于io 密集的非常好用:eg. file,DB读写,网络访问 异步: javascript就是个单线程语言, ...

  6. 了解Javascript中的异步等待

    在本文中,我们将探讨async/await对于每个Javascript开发人员来说,异步编程的首选工具.如果您不熟悉javascript,请不要担心,本文将帮助您async/await从头开始理解. ...

  7. 理解JavaScript中的异步和同步

    1.Javascript语言是一门单线程的语言 单线程和异步确实不能同时成为一个语言的特性.js选择了成为单线程的语言,所以它本身不可能是异步的.因为浏览器只分配给js一个主线程,用来执行那些函数,一 ...

  8. 详解 JavaScript 中的异步与线程

    一.概念 由于 JavaScript 是运行在浏览器的脚本,主要用来操作 DOM,实现用户交互,所以 JavaScript 属于单线程,因为如果一个线程在删除一个 DOM 元素,另一个线程又要给这个 ...

  9. javascript中的异步编程

    正常情况下js都是顺序执行的,但是也有很多场景下实际上是异步操作: 1.定时器都是异步操作 2.事件绑定都是异步操作 3.AJAX中一般我们都采取异步操作(也可以同步) 4.回调函数可以理解为异步(不 ...

最新文章

  1. 全国计算机等级考试一级ps考试试题,计算机等级考试一级ps考前试题及答案
  2. 网站服务器蜘蛛日志怎么看,如何查看百度蜘蛛,google蜘蛛爬取记录?《网站日志分析篇》...
  3. mysql优化学习(二)
  4. python中 使用join()方法 对各种数据类型中元的素进行合并拼接
  5. 选中条目android spinner的使用
  6. Qracle学习:排序
  7. Java中转发(Forward)和重定向(Redirect)的区别
  8. 政务大数据的东莞实践 智慧政府建设步伐加快
  9. 蓝桥杯51单片机之利用中断同时控制流水灯、数码管、独立按键、蜂鸣器【单片机开发初学者有趣综合案例】
  10. jdbc面试_JDBC面试问答
  11. UTF-8 Unicode ANSI网页编码的区别
  12. 可行性研究报告模板 Shane版
  13. postSQL hash分表
  14. 前端Svelte框架初体验
  15. android 小米相机权限,小米如何设置访问相机权限设置
  16. 报价单常见问题及高效拯救你的报价实用手册
  17. Struts2 的 s:property标签用法
  18. 用JS写了一个30分钟倒计时器
  19. 风流霸主姜小白-第1章 姜太公劳苦功高始建齐 周幽王荒淫无度葬西周
  20. 开发小组共同使用协同文档

热门文章

  1. ERP系统为什么要使用集成的数据和信息平台?
  2. 将表里的数据批量生成INSERT语句的存储过程 继续增强版
  3. 并发异步处理队列 .NET 4.5+
  4. CentOS6.4之文本编辑器Vi/Vim
  5. JS中的prototype
  6. eBay的Turmeric和VJet的源程序移到了GitHub上
  7. Action 相关组件
  8. vc中常用文件操作(二) Ini文件操作
  9. SAP公司的一些大概介绍
  10. switch case 支持的 6 种数据类型!