一.同步代码和异步代码
同步代码:浏览器按照我们书写代码的顺序一行一行地执行程序的。在上一行完成后会执行下一行。
同步代码:逐行执行,需原地等待结果,才继续向下执行
异步代码:可以在执行一个可能长期运行的任务的同时继续对其他事件做出反应而不必等待任务完成。与此同时,你的程序也将在完成后显示结果。
异步代码:调用后耗时,不阻塞代码继续执行(不必原地等待),在将来完成后触发一个回调函数
JS中有哪些异步代码
*setTimeout / setInterval
*事件
*AJAX
二.回调函数地狱
概念:在回调函数中嵌套回调函数,一直嵌套下去就形成了回调函数地狱
缺点:可读性差,异常无法捕获,耦合性严重,牵一发动全身
三.Promise-链式调用
概念:依靠then()方法会返回一个新生成的Promise对象特性,继续串联下一环任务,直到结束
细节:then()回调函数中的返回值,会影响新生成的Promise对象最终状态和结果
好处:通过链式调用,解决回调函数嵌套问题
四.async函数和await
定义:async函数是使用async关键字声明的函数。async函数是AsyncFunction构造函数的实例,并且其中允许使用await关键字。async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise
五.async函数和await_捕获错误
使用:
语法:
六.认识-事件循环(EventLoop)
好处:掌握JavaScript是如何安排和运行代码的
概念:JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如java和C
原因:JavaScript单线程(某一刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型
事件循环-执行过程
定义:执行代码和收集异步任务的模型,在调用栈空闲,反复调用任务队列里回调函数的执行机制,就叫事件循环
七.宏任务与微任务
ES6之后引入了Promise对象,让JS引擎也可以发起异步任务
异步任务分为:
*宏任务:由浏览器环境执行的异步代码
*微任务:由JS引擎环境执行的异步代码
Promise本身是同步的,而then和catch回调函数是异步的
JavaScript内代码如何执行
*执行第一个script脚本事件宏任务,里面同步代码
*遇到宏任务/微任务交给宿主环境,有结果回调函数进入对应队列
*当执行栈空闲时,清空微任务队列,再执行下一个宏任务,从1再来
八.Promise.all静态方法
概念:合并多个Promise对象,等待所有同时成功完成(或某一个失败),做后续逻辑
语法:
const p = Promise.all([Promise对象, Promise对象, ...])
p.then(result => {// result结果:[Promise对象成功结果, Promise对象成功结果, ...]
}).catch(error => {// 第一个失败的Promise对象,抛出的异常
})