一天时间迅速准备前端面试|JavaScript——异步进阶
创始人
2024-06-02 15:37:58

🌈本系列文章是博主精心整理的面试热点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速建立前端面试知识体系。抓住每一场面试的机会,知己知彼才能百战百胜!

  • 上期回顾 JS基础–异步
  • 本系列订阅 一天时间迅速准备前端面试(高薪精品)–欢迎订阅

文章目录

  • 本期介绍
  • 主要内容
  • 关键字
    • 什么是event loop?
    • event loop 执行过程
      • 图示
    • Promise有哪三种状态
      • 状态的表现
    • Promise的then和catch如何影响状态的变化
    • async/await介绍
    • 什么是宏任务和微任务
      • 宏任务
      • 微任务


本期介绍

JS 的特色就是异步编程,所有有很多关于异步的考点,本章都会讲解。如 event loop、promise、async-await、微任务和宏任务。学不会这些,就不算是精通 JS。

主要内容

  • event loop 执行过程
  • Promise 全面使用
  • async await 全面使用
  • 微任务和宏任务

关键字

  • Promise
  • async await
  • event loop
  • 微任务和宏任务

什么是event loop?

event loop,也叫事件循环/事件轮询,JS是单线程运行的,从前到后,一行一行执行,如果某一行执行报错,则停止下面的代码执行,先把同步代码执行完,再执行异步,异步要基于回调来实现,event loop 就是异步回调的实现原理。

event loop 执行过程

  1. 同步代码,一行一行放在 Call Stack 执行

  2. 遇到异步,会先“记录”下,等待时机(定时,网络请求等)

  3. 时机到了,就会移动到 Callback Queue

  4. 如果 Call Stack 为空(即异步代码执行完)Event loop 开始工作

  5. 轮训查找 Callback Queue,如有则移动到 Call Stack 执行

  6. 然后继续轮询查找(永动机一样)

图示

在这里插入图片描述
图示代码执行过程:

  1. 将 console.log(“Hi”) 推入调用栈,调用栈会执行代码
  2. 执行代码,控制台打印“Hi”,调用栈清空
  3. 执行 setTimeout,setTimeout由浏览器定义,不是ES6的内容;将定时器放到Web APIs中,到时间后将回调函数放到回调函数队列中
  4. 执行完了setTimeout, 清空调用栈
  5. console.log(“Bye”)进入调用栈,执行,调用栈清空
  6. 同步代码被执行完,,回调栈空,浏览器内核启动时间循环机制
  7. 五秒之后,定时器将cb1推到回调函数队列中
  8. 事件循环将cb1放入调用栈

Promise有哪三种状态

promise 有三种状态,分别是:pending(初始化状态)、resolved(成功状态)、rejected(失败状态)

pending ->resolvedpending->rejected

变化不可逆

状态的表现

pending状态,不会触发then和catch

resolved状态,会触发后续的then回调函数

rejected状态,会触发后续的catch回调函数

reslove只会触发then的回调,不会触发catch

reject只会触发catch的回调,不会触发then

Promise的then和catch如何影响状态的变化

then正常返回resolved,里面有报错则返回rejected

catch正常返回resolved,里面有报错则返回rejected

在这里插入图片描述
在这里插入图片描述

async/await介绍

解决异步回调callback hell(回调地狱),Promise then catch 链式调用,但也是基于回调函数,async/await是用同步语法编写异步代码,是同步语法,彻底消灭回调函数,是异步写法的最佳解决方式,是消灭异步回调的终极武器。
注意:async/await和promise不冲突。
await相当于Promise的then
try…catch可捕获日常,代替了Promise的catch

写法一:

!(async function(){//同步的语法const img1 = await loadImg(src1)//await 必须用async函数包裹cosole.log(img1.height,img.width)const img2 = await loadImg(src2)cosnole.log(img.height,img2.width)}) ( )

写法二:

async function loadImg1() {const img1 = await loadImg(src1)return img1)

什么是宏任务和微任务

宏任务和微任务是event Loop中的两种任务,分别处在两种任务队列中。微任务是ES6语法规定的,宏任务是浏览器规定的。

宏任务

setTimeout,setInterval, Ajax, DOM事件;

微任务

Promise async/await

微任务执行时机比宏任务要早

相关内容

热门资讯

易点天下启动H股上市前期筹备工... 12月5日晚间,易点天下(301171)公告称,公司董事会授权管理层启动H股上市的前期筹备工作,授权...
“中招”流感该如何应对?专家提... 转自:央视新闻客户端  近期,气温波动幅度大,容易造成人体免疫力低下。今天,国家卫生健康委举行新闻发...
网飞Netflix宣布以827... 转自:中国基金报  12月5日晚间,Netflix(奈飞)宣布收购华纳兄弟探索公司,Netflix将...
香港大埔宏福苑火灾79名伤者全... 据新华社香港12月5日电 香港特区行政长官李家超和特区政府多位局长5日联合召开记者会。其中医务卫生局...
湖南平江通报老年妇女遭家暴:成... 湖南省岳阳市平江县联合处置组12月6日发布情况通报:12月4日11时许,我县公安局接到报警称,一老年...