js 中的异步队列(micro & macro)

js都是靠事件驱动的, js中的事件循环机制是什么呢?

只是简单写一下自己的理解, 所以不是很全面;

js 程序执行有 主队列 以及 异步队列两种方式

栈中是按照顺序进行执行, 对于一段代码的解释, 按照不同的类型进行解释,

入栈, 然后按照栈的顺序(后进先出)依次进行执行

主队列, 即从上到下的方式依次进行执行

异步队列主要包括macroTask 和 macroTask

  1. macroTask, 主要包括 setTimeout setInterval IO UIRendering(只列举常用的)

  2. microTask , 主要包括 Promise process

主线程执行完成后, 会首先查看 microTask 队列中是否有, 执行完成后, 再执行 macroTask

例如如下我的测试代码

console.log("1")
setTimeout(function () {
console.log("2")
})
Promise.resolve().then(function () {
console.log("3")
setTimeout(function () {
console.log("31")
setTimeout(function () {
console.log("311")
})
Promise.resolve().then(function () {
console.log("3111")
})
})
}).then(function () {
console.log("4")
})
setTimeout(function () {
console.log("5")
Promise.resolve().then(function () {
console.log("51")
})
})
console.log("11") //输出如下: 1 11 3 4 2 5 51 31 3111 311
//macro [2, 5] [31]
//micro [3, 4] [51]

需要注意的地方:

microTask会阻碍页面的 render, render 是属于 macroTask;

所以如果有 microTask 一直循环执行的话, 会阻碍 ui 的 render;

但是 setTimeout 不会;

另外要注意 rAF(requestAnimationFrame) 的使用, 这个是用来专门进行渲染使用的, 执行速度会

比 setTimeout 少很多.

最新文章

  1. swap分区
  2. Count the Trees[HDU1131]
  3. codeforce 600A - Extract Numbers
  4. Spring+AOP+Log4j 用注解的方式记录指定某个方法的日志
  5. python3 selenium 如何处理异常情况
  6. 【安卓开发】Android为什么选择binder
  7. array_map、array_walk、array_reduce
  8. Android 音视频开发(一) : 通过三种方式绘制图片
  9. caffe特征层可视化
  10. vs2015 ncnn
  11. c++ 常成员函数 和 常对象
  12. Oracle一次可以查询多个表的结果的方法
  13. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)
  14. asp.net 发送电子邮件本地测试正常,但服务器上异常的解决办法
  15. vs2015 产品密钥
  16. Delphi-idHttp-Post JSON用法 good
  17. 并发系列(一)-----synchronized关键字
  18. ML之监督学习算法之分类算法一 ———— k-近邻算法(最邻近算法)
  19. hihoCoder 1636 Pangu and Stones
  20. iOS同一项目多个Target的快速实现方法 - 两种使用场景详解

热门文章

  1. 推送一个docker 使用阿里docker hub
  2. python3 marshmallow学习
  3. CodeForces 1228F One Node is Gone
  4. 安装vivado 2016.1时出错
  5. 什么是B+树
  6. android studio打印
  7. Java集合学习(6):LinkedHashSet
  8. can解析
  9. Hadoop运行环境搭建
  10. Plan B