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 少很多.

js 队列的更多相关文章

  1. js 队列和事件循环

    1.示例代码 <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UT ...

  2. 简单的js队列

    简单的js队列 /** * [Queue] * @param {[Int]} size [队列大小] */ function Queue(size) { var list = []; //向队列中添加 ...

  3. js队列

    用指针和数组模拟基本队列 http://blog.csdn.net/zhuwq585/article/details/53177192 js下的事件队列,或者异步队列 http://www.jb51. ...

  4. js队列的实现问题

    所谓队列就是排队的序列问题,有出有进,比如在银行排队办理业务,一般都是前一个办理完成后下一个自动进入队列 <script>  /* * 模拟队列 */ var Qu ={}; //构造函数 ...

  5. 一个简单的js队列,逻辑很清晰

    function Queue(type) { //type 是否是一个接着一个执行 function QueueConst() {} QueueConst.execute_ing=[], QueueC ...

  6. 写js写傻了,明天研究一下异步

    在html某元素上绑定一个click事件,该事件是一个执行事件很长的函数,比如执行几十亿或几百亿次加法,那么在这个函数执行的过程中,其他元素绑定的事件,是如何触发的呢,异步触发还是同步,触发时是怎么执 ...

  7. 队列的实现 -- 数据结构与算法的javascript描述 第五章

    队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...

  8. 试着讲清楚:js代码运行机制

    一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...

  9. AJAX原理及XMLHttpRequest对象分析

    今天的主题是前端都了解的AJAX,但其中都有哪些知识点,还需要深入分析. 首先揭示AJAX的字面意思,Asynchronous Javascript And XML,通俗点就是“异步Javascrip ...

随机推荐

  1. springMVC 任意文件读取相关路径

    在做检查的时候,发现一个路径是可以去读取文件的,但是平时的/etc/目录下都无法读取到,只能先读取web目录下的文件尝试. 因为知道是springMVC框架,所以可以先尝试该路径 ../../WEB- ...

  2. element-ui 自定义 Upload 上传进度条

    <el-upload class="upload-demo" ref="vidos" :action="URL+'/api/post/file' ...

  3. 记录下hbuilder vue项目打包APP 在IOS上点击延迟的问题

    做的项目打包成APP在IOS 上有延迟问题,在安卓下却不会,联想到之前 用IONIC时打包的APP也是 在IOS下有300毫秒延迟问题.所以 只能 认吧. 安装fastclick 插件: npm in ...

  4. 没有用到React,为什么我需要import引入React?

    没有用到React,为什么我需要import引入React? 本质上来说JSX是React.createElement(component, props, ...children)方法的语法糖. 所以 ...

  5. 数据结构与算法16—平衡二叉(AVL)树

    我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定.但是,在某些极端的情况下(如在 ...

  6. echart添加轴最小值,最大值,间隔以及设置线条颜色

    yAxis: [{ type: 'value' }, { type: 'value', name: '上证指数', //设置最小值,最大值,间隔 min: 1000, max: 6000, inter ...

  7. 升级.net core 3.x 后mvc项目调试状态编辑view代码不能实时预览

    https://stackoverflow.com/a/58126955 简单来说 需要在nuget上安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilati ...

  8. day 39

    ORM 对象关系映射 表 ---> 类 字段 ---> 属性 记录 ---> 对象 优点: ​ 使用者无需关心具体的SQL命令如何编写. ​ 直接通过调用方法,来执行相对应的SQL命 ...

  9. Golang: 打印命令行参数

    记得最早在学校机房学习 Java 时,照着书上的例子,写一个最简单 main 方法,当程序运行并在屏幕上打印出 hello world 时,内心竟有种莫名的激动,相信很多人都有这种经历吧. 不管学什么 ...

  10. MyBatis的一级缓存、二级缓存演示以及讲解,序列化异常的处理

    MyBatis的缓存机制 缓存就是内存中的一个空间,通常用来提高查询效率 MyBatis支持两种缓存技术:一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭 一级缓存 (1)一级缓存默认开启 ...