1. EventLoop

1.1 调用栈

当一个方法执行时内部调用另外的方法,则会形成调用栈,如图:

1.2 任务队列

JavaScript有一个主线程执行当前任务,主线程的代码同步执行,并把遇到的事件和回调注册到事件表中。

当事件表中的事件被触发时,将会把对应的处理函数推送到任务队列当中。

每一次EventLoop会从任务队列中获取最前面的事件处理函数进行执行。

  • macrotasks queue(图中task queue)

    包括: 整体代码script,setTimeout,setInterval,setImmediate,I/O,UI渲染
  • microtasks queue

    包括: Promise process.nextTick Object.observe MutationObserver

注意:每一次Eventloop拥有独立的微任务队列,在每次同步调用堆栈结束后,会检查微任务队列中是否有需要处理的事件,如果有就进行调用.

1.3 事件循环

当一轮事件循环结束后(Fun1),进行下一轮循环(Fun2).

事件执行顺序

根据macrotasks队列和microtasks队列的执行时机不同,因此需要注意异步代码的执行顺序

其原则是:

  1. macrotasks将进入宏任务队列,将在下一次eventloop时进行调用(先进先出)

    常见的包括XHR,JSONP,setTimeout,setInterval等
  2. microtasks将进入微任务队列,在当前eventloop结束前进行调用

    microtasks常见的有Promise.then,process.nextTick(nodejs)等
console.log(1)
setTimeout(()=>{console.log(2)},0);
Promise.resolve(console.log(3)).then(()=>{console.log(4)});
var ps = new Promise((resolve,reject)=>{console.log(5);resolve(1)});
ps.then(()=>{console.log(6)});
var fs = new Promise((filename)=>{return file.read(filename)});
fs.then((rs)=>{console.log(7)});
//1,3,5,4,6,7,2

refs:

https://github.com/ccforward/cc/issues/48

https://html.spec.whatwg.org/multipage/webappapis.html#task-queue

Web高级 Eventloop和事件执行顺序的更多相关文章

  1. ASP.NET MVC自定义Module记录管道事件执行顺序

    1. 在Visual Studio 新建项目,模板为空,下面结构选择MVC. 2. 在项目中新建一个类MyModule,实现IHttpModule接口 namespace SimpleApp.Infr ...

  2. Wex5页面事件执行顺序

    wex5 事件执行顺序data组件的onCustomRefresh→ model组件的onLoad→ windowReceiver组件的onReceive

  3. ASP.NET Page对象各事件执行顺序(转)

    很久没写 asp.net 的东西了,search 了一下 page 的事件执行顺序,找到如下的东西,仅仅做记录用 Page.PreInit 在页初始化开始时发生 Page.Init 当服务器控件初始化 ...

  4. jquery中各个事件执行顺序如下:

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  5. jquery ajax 事件执行顺序

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  6. 关于js事件执行顺序

    关于js事件执行顺序小技巧 js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 ...

  7. 关于js事件执行顺序小技巧

    js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 <button ty ...

  8. jquery ajax 中各个事件执行顺序

    jquery ajax 中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事 ...

  9. 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序

    主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...

随机推荐

  1. python定时脚本判断服务器内存

    经常我们会发现服务器跑着跑着内存使用率达到了百分之八九十,或者有时候直接挂掉,在我们还没定位是哪块代码有问题导致内存占用很大的时候,可以先写个定时脚本,当服务器内存使用率达到一定值的时候,就重启一起服 ...

  2. pandas 常用函数

  3. 最常用的JavaScript类的定义

    混合的构造函数/原型方式 联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象.这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法).结果是,所有函 ...

  4. 学习将码云账号和git连接,并且创建一个项目

    一顿操作猛如虎,哈哈 参考网址:https://git-scm.com/book/zh/v1/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7 ...

  5. python--sort()和sorted()高级排序

    1.list中的sort()方法: def sort(self, key=None, reverse=False): # real signature unknown; restored from _ ...

  6. LR-SVM(有待重新整理)

    参考:http://www.zhihu.com/question/26768865 总结: 1)在线学习:SVM不支持在线学习,LR支持 2)不平衡数据:SVM不依赖于数据的分布,所以数据是否平衡影响 ...

  7. s21day17 python笔记

    s21day17 python笔记 一.内容回顾及补充 回顾 补充 第三方模块补充 需要下载安装后才能导入使用 安装方式: pip包管理工具 # 把pip.exe 所在的目录添加到环境变量中. pip ...

  8. vue 配合vue-resource调用接口,获取数据

    1.先用node+express+mysql简单配置一下后台 const express = require('express');const mysql = require('mysql');con ...

  9. zznuoj 1195 : 猴子选大王(结构体专题)

    题目描述 n只猴子围坐成一个圈,按顺时针方向从1到n编号.然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王. ...

  10. javascript的加减乘除结果会有误差,在两个浮点数相加的时候会比较明显。以下函数返回较为精确的计算结果

    加法函数(返回值:arg1加arg2的精确结果  ) function accAdd (arg1, arg2) { var r1, r2, m, c try { r1 = arg1.toString( ...