Promise笔记

104 阅读2分钟

【promise定义】

简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果

【promise特点】

  1. 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
  2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。从pending变为fulfilled和从pending变为rejected。

【promise缺点】

  1. 无法中途取消Promise
  2. 如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
  3. 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

【Promise.prototype.finally()】

finally方法的回调函数不接受任何参数,没办法知道前面的 Promise 状态到底是fulfilled还是rejected
finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果

【Promise.all()】

将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.all([p1, p2, p3]);

  1. 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数
  2. 只要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状态。