js 深入原理讲解系列-事件循环

能看懂这一题你就掌握了 js 事件循环的核心原理

不要专业的术语,说人话,讲明白!

Q: 输出下面 console.log 的正确的顺序?

console.log('Hello World!'); // 

async function async1() {
console.log('async1 start');//
await async2();
console.log('async1 end');//
} async function async2() {
console.log('async2 start');//
return new Promise((resolve, reject) => {
resolve();
console.log('async2 promise');//
})
} console.log('script start');// setTimeout(function() {
console.log('setTimeout');//
}, 0); async1(); new Promise(function(resolve) {
console.log('promise1');//
resolve();
}).then(function() {
console.log('promise2');//
}).then(function() {
console.log('promise3');//
}); console.log('script end');//

A:


console.log('Hello World!', 1); // 1 async function async1() {
console.log('async1 start', 3);// 3
await async2();
console.log('async1 end', 10);// 10
} async function async2() {
console.log('async2 start', 4);// 4
return new Promise((resolve, reject) => {
resolve();
console.log('async2 promise', 5);// 5
})
} console.log('script start', 2);// 2 setTimeout(function() {
console.log('setTimeout', 11);// 11
}, 0); async1(); new Promise(function(resolve) {
console.log('promise1', 6);//6
resolve();
}).then(function() {
console.log('promise2', 8);// 8
}).then(function() {
console.log('promise3', 9);// 9
}); console.log('script end', 7);// 7 /* Hello World! 1
script start 2
async1 start 3
async2 start 4
async2 promise 5
promise1 6
script end 7
promise2 8
promise3 9
async1 end 10
setTimeout 11 */

翻译后的等价代码



讲解:

  1. 同步任务,先执行
  2. 遇到异步任务,先执行异步任务里面的同步任务,然后将异步任务加入到 promise 消息队列排队
  3. 当同步完成后,将promise 消息队列排队的异步任务按照 先入先出的 queue 顺序,依次取出执行
  4. promise 构造函数,在初始化的时候会立即执行

事件循环

同步任务:

异步任务: 微任务, 宏任务

Promise

thenable

IIFE

closure

constructor function

refs



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


js 深入原理讲解系列-事件循环的更多相关文章

  1. js 深入原理讲解系列-Promise

    js 深入原理讲解系列-Promise 能看懂这一题你就掌握了 js Promise 的核心原理 不要专业的术语,说人话,讲明白! Q: 输出下面 console.log 的正确的顺序? const ...

  2. js 深入原理讲解系列-currying function

    js 深入原理讲解系列-currying function 能看懂这一题你就掌握了 js 科里函数的核心原理 不要专业的术语,说人话,讲明白! Q: 实现 sum 函数使得以下表达式的值正确 cons ...

  3. Node.js event loop 和 JS 浏览器环境下的事件循环的区别

    Node.js  event loop 和 JS 浏览器环境下的事件循环的区别: 1.线程与进程: JS 是单线程执行的,指的是一个进程里只有一个主线程,那到底什么是线程?什么是进程? 进程是 CPU ...

  4. JS执行环境栈及事件循环机制—简洁明了的讲解

    JavaScript解释器在浏览器中是单线程的,这意味着浏览器在同一时间内只执行一个事件,对于其他的事件我们把它们排队在一个称为 执行栈(调用栈) 的地方.下表是一个单线程栈的抽象视图: 我们已经知道 ...

  5. 转:10分钟了解JS堆、栈以及事件循环的概念

    https://juejin.im/post/5b1deac06fb9a01e643e2a95?utm_medium=fe&utm_source=weixinqun 前言 其实一开始对栈.堆的 ...

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

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

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

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

  8. RocketMQ原理讲解系列文章

    [RocketMQ原理解析][http://blog.csdn.net/quhongwei_zhanqiu/article/category/2548637] [消息的可靠性.顺序和重复][https ...

  9. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

随机推荐

  1. 在原生开发中控制HTML5视频!

    在原生开发中控制HTML5视频! PC端 视频如何自动播放! 在video标签中添加 autoplay + muted(静音属性!) 温馨提醒: video是一个块级元素! 但是唯一的缺陷就是视频没有 ...

  2. gitignore 不起作用的解决办法 不再跟踪 让.gitignore生效,跟踪希望被跟踪的文件

    实践 # https://git-scm.com/docs/gitignore https://git-scm.com/docs/gitignore 不跟踪log目录下的所有文件,但需要保留这个文件夹 ...

  3. .Net框架的概念和运行原理

    原文 https://blog.csdn.net/WandDouDou/article/details/80678449

  4. WPF和MVVM的结合使用方法,不可错过

    Model:存储数据模型(类) 也在此业务逻辑,主要负责类文件的存储. ViewModel:连接View和Model,借助Command来负责界面的跳转和调用Model中方法来操作Model的数据. ...

  5. 详述C++casting操作

    Casting----类型转换,也就是将数据从一种类型转换到另一种类型的操作.本文首先给出两种类型转换的方式:隐式转换和显式转换,然后简单介绍一下C语言常用的类型转换方式,最后详细叙述C++中常用的三 ...

  6. OpenStack (neutron 网络服务)

    neutron介绍 提供 OpenStack 虚拟网络服务,也是 OpenStack 重要的核心模块之一,该模块最开始是 Nova 的一部分,叫 nova-network,后来从 Nova 中分离出来 ...

  7. Calendar 日期判断 等于 。小于。大于

    public static void main(String[] args) throws Exception { String startTime = "2012-12-12 12:45: ...

  8. MariaDB数据库 ----数据库简介,用户管理,数据库创建,数据类型、数据增删改(实例演示)

    数据库简介 数据库--即电子文件柜,用户可以对文件中的数据进行增,删,改,查等操作. 数据库分类 关系型数据库 关系型数据库管理系统(Relational Database Management Sy ...

  9. 遇到的一个bug

    /// <summary> /// 检测玩家是否在机器人的球形碰撞体内,这个碰撞体是机器人的侦测范围,玩家在内部会进行视野检测和声音检测 /// </summary> priv ...

  10. 牛客网暑期ACM多校训练营(第二场)carpet

    传送门:carpet 题意 有一个n*m的地毯,aij表示地毯每格的元素,bij表示地毯每格的价格,要求选取一块价格最大值最小的地毯,并且这块地毯无限铺开之后,原地毯是其子矩阵. 题解 先找到这个矩阵 ...