【promise定义】
简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果
【promise特点】
- 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。从pending变为fulfilled和从pending变为rejected。
【promise缺点】
- 无法中途取消Promise
- 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
- 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
【Promise.prototype.finally()】
finally方法的回调函数不接受任何参数,没办法知道前面的 Promise 状态到底是fulfilled还是rejected
finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果
【Promise.all()】
将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.all([p1, p2, p3]);
- 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数
- 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数
【Promise.race()】
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。
那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
【Promise.allSettled()】(ES2020引入)
Promise.allSettled()方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。
只有等到参数数组的所有 Promise 对象都发生状态变更(不管是fulfilled还是rejected),返回的 Promise 对象才会发生状态变更。
const p = Promise.allSettled([p1, p2, p3])
p.then(function(results) {})
results的每个成员是一个对象,对象的格式是固定的,对应异步操作的结果
// 异步操作成功时
{status: 'fulfilled', value: value}
// 异步操作失败时
{status: 'rejected', reason: reason}
【Promise.any()】(ES2021引入)
只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;
如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。