Promise 是异步编程的一种解决方案,它本质上是一个构造函数,可以实例化一个对象。当实例一个 Promise 时需要传入一个执行函数,并携带着两个回调函数 resolve() 和 reject(),promise 实例有三个状态进行中、已完成、已拒绝,其状态的改变是不可逆的,已完成的时候会调取 resolve,拒绝的时候会调取 reject。
Promise 的返回值是一个新的 promise 对象,这个对象可以调用 then、catch、finally 方法,其中 then 方法可以接收两个回调函数作为参数,第一个为promise对象状态完成时调用,是作为处理操作成功后的业务,第二个回调函数是状态变为 rejected 时调用,处理操作异常的业务。
catch 只接受一个参数,一般来说我们做业务时不会在 then 定义第二参数函数,用 catch 去 捕获错误,因为它返回还是一个 promise 对象,可以继续链式调用使用 then 方法
finally 无论 promise 对象最后状态如何都会执行的操作
Promise 有着处理多个 promise 实例,包装成一个新的 promise 实例的方法,其中有 all(),向 all 传入多个实例的数组,当其全部成功时返后一个结果数组,失败时返回最先状态为失败的值。
还有 race(),和 all 差不多接收参数是 promise 数组,返回的值为最快执行完成 promise 的值
any(), 只要有一个 promise 成功,会返回首个成功的 promise 的值,方法提前结束,如果全都失败,则状态变为rejected,返回报错信息。
优点
- 避免层层嵌套的回调函数,将异步操作以同步操作的流程表达出来
- 提供统一的接口,使控制异步操作更加容易
缺点
- 无法取消 Promise,一旦新建它就会立即执行,无法中途取消。
- 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
- 当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
async/await
async表示该为异步函数,并且返回一个promise对象,await会阻塞后面的代码,如果是promise对象,就会等待执行resolve的值作为await表达式的运算结果,等待该行结果运算完成,async和await配合使用能让异步操作代码读起来更加同步。