说一下对 Promise 的理解
❤️

说一下对 Promise 的理解

😮
能大概说出来用法,和常用的 API ,还是的组织一下表述的语言

 
原答案:
PromiseES6 中提出的一个解决回调地狱的方法,用于处理异步操作。通过 new 关键字生成一个 Promise 的实例,可以返回三种状态,pendingfulfilledrejected,之后可以使用 thencatch 进行链式调用再进行下一步的处理。
 
参考:
内容参考 阮一峰-ES6入门

1. Promise 的含义

Promise 是异步编程的一种解决方案,比传统的回调函数更加强大和合适。
所谓 Promise,就是一个容器,里面包含着一个未来才会结束的事件结果(通常是指一个异步方法)。
Promise 有两个特点:
  • 对象的状态不受外界的影响。Promise 对象包含三种状态 pendingfulfilledrejected
  • 一旦状态改变,就不会再变,任何时候都可以获得这个结果。状态只能从 pending - fulfilledpending - rejected
Promise 的缺点:
  • 无法取消 Promise
  • 若不设置回调函数,内部会报错,但是不会反应到外部
  • 当处于 pending 时,无法确认是刚刚开始还是即将完成

2. 基本用法

Promise 是一个构造函数,Promise 构造函数接受一个函数作为参数,参数有两个 resolvereject
resolve 的作用是:当 Promise 的状态从 pending 转换到 fulfilled 时,在异步操作成功时调用,并将异步操作的结果作为参数传出去;
reject 的作用是:当 Promise 的状态从 pending 装换为 rejected 时,在异步操作是啊吧时调用,并将异步操作的结果作为参数传出去;
Promise 生成实例后,可以使用 then 分别指定 resolvedrejected 状态的回调函数;

3. Promise.prototype.then()

then 可以使用链式写法。then 方法接收两个函数作为参数,第一个函数当状态变为 resolved 时调用,第二个函数当状态变成 rejected 是调用

4. Promise.prototype.catch()

Promise.prototype.catch()方法是.then(null, rejection).then(undefined, rejection)的别名,用于指定发生错误时的回调函数。
Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。

5. Promise.prototype.finally()

finally 用于不论 Promise 对象最终的状态是什么,都会执行的一个方法
finally 的回调函数不接受任何的参数

6. Promise.all()

用于将多个 Promise 实例包装成一个新的 Promise 实例
const p = Promise.all([p1, p2, p3]);
p 的状态有两种情况
  • p1p2p3 的状态都成为 fulfilledp 的状态才能变为 fulfilled
  • p1p2p3 其中有一个的状态成为 rejectedp 的状态就变成 rejected,此时,第一个被 reject 的实例的返回值回传给 p 的回调函数

7. Promise.race()

该方法同样是将多个 Promise 实例包装成一个新的 Promise 实例
不同的是,p1p2p3 中只要有一个的状态发生改变,p 的状态就会跟着改变。该实例的返回值,就会传给 p 的回调函数

8. Promise.allSettled()

const promises = [
  fetch('/api-1'),
  fetch('/api-2'),
  fetch('/api-3'),
];

await Promise.allSettled(promises);
removeLoadingIndicator();
用来确定一组异步操作是否都结束了。
该方法接收一个数组作为参数,数组的每个元素都是一个 Promise 对象,只有等到所有的 Promise 对象的状态发生改变,返回的 Promise 对象状态才会发生变化

9. Promise.any()

同样是接收一组 Promise 实例作为参数,当一个实例的状态变成 fulfilled 的时候,包装的实例就会变成 fulfilled 状态;只有全部实例的状态变成 rejected 的时候,包装的实例才会变成 fulfilled 状态

10. Promise.resolve()

可以将现有的对象转换为 Promise 对象

11. Promise.reject()

同样也可以返回一个 Promise 实例,该实例的状态为 rejected