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. 转 6 jmeter元件的作用域与执行顺序

    6 jmeter元件的作用域与执行顺序   元件的作用域 配置元件(config elements)会影响其作用范围内的所有元件.前置处理程序(Per-processors)在其作用范围内的每一个sa ...

  2. C#高级编程第11版 - 第五章 索引

    [1]5.1 泛型概述 1.通过泛型,你可以创建独立于特定类型(contained types)以外的方法和类,而不用为不同类型编写多份同样功能的代码,你只需要创建一个方法或者类. 2.泛型类使用泛型 ...

  3. ETL优化(转载)

    1.引言 数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取.转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操 ...

  4. spark join 广告用户特征 与广告特征的 join 拿到训练集

    spark join 广告特征做广播

  5. Integer的十进制转二,八,十六进制

    1,toBinaryString(int i) 将i以二进制形式输出出来 2,toOctalString(int i)将i以八进制形式输出出来 3,toHexString(int i)将i以十六进制形 ...

  6. Java——集合框架之ArrayList,LinkedList,迭代器Iterator

    概述--集合框架 Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection ...

  7. Lambda表达式及相关练习

    语法格式一无参数无返回值 语法格式二有一个参数并且无返回值 语法格式三若只有一个参数小括号可以省略不写 语法格式四有两个以上的参数有返回值并且Lambda体中有多条语句 语法格式五若Lambda体中只 ...

  8. 为什么首次ping丢包

    1.之前就有关于为什么我们ping包的时候第一个包总是显示逗点,也就是超时的困惑.很多人的解答就是因为ARP啊,然后就没有下文了.继续追问那么为什么ARP就要是逗点呢?然后就又有一些人说因为要ARP解 ...

  9. Python开发桌面微型计算器

    开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器 ...

  10. Pytest(1)安装与入门

    pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍,它 ...