1.同步vs异步
同步和异步在程序执行是相反的,同步执行指令是分先后顺序的,就像排队打饭一样,按照顺序执行。异步执行不按照先后到达的顺序,准备好了就可以进行,不会造成进程阻塞的问题。JS是单线程的,如果按照同步执行的顺序执行代码,很容易造成阻塞,影响程序执行的性能。由此可见,异步编程在JS中的地位。
2.异步编程常用场景
- 回调函数
- 事件监听
- Promise
- Generator
- async / awit
在以上场景下,会容易出现回调地狱的现象(多层回调函数互相嵌套),那如何解决回调地狱呢?
3.promise核心
在这一部分主要介绍promise和promise API
- 什么是promise
可以将promise理解为容器,内部保存的是未来某个时刻才会执行完的事件。从语法上看,promise是一个对象,从它可以获得异步操作的消息。
- promise状态机
promise有三个状态:
pedding(待定):初始状态,既没有完成,也没有拒绝
fulfilled(完成):操作成功完成
rejected(拒绝):操作失败
- promise中常用方法
promise.prototype.then( )
为契约添加处理程序的主要方法,最多接收两个参onResolved,onReject分别进入“兑现”和“拒绝”状态时执行。
promise.prototype.catch()
用于给promise添加拒绝处理程序,该方法仅接收一个参数onReject的处理程序。事实上,这个方法就是一个语法糖,调用它相当于调用Promise.prototype.then(null, onRejected)
promise.prototype.finally()
在promise转化为解决或者拒绝状态时都会执行,这个方法可以避免处理和拒绝状态中的冗余代码部分。
Promise.all()
参数:接收一个可迭代对象
此方法用于汇总多个promise异步请求并行操作,当所有结果成功返回时按照请求顺序返回成功;其中如果有一个请求失败则返回失败。
Promise.race()
参数:接收一个可迭代对象
race()返回一个promise,只要参数的promise之中有一个实例率先改变状态,则race方法的返回状态就跟着改变。
Promise.allSetted()
接收一个promise数组,返回一个新的promise
当promise.allSetted全部处理完成后,可以拿到每个promise的状态,而不管其是否处理成功。