简述 Promise,有几种状态、特点是什么、解决了什么问题、优缺点是什么?
题干
- Promise
题解
Promise
对象是异步编程的一种解决方案,最早由社区提出。Promise
是用于处理异步操作的对象,它解决了传统的回调函数方式(回调地狱)所带来的代码可读性和维护性的问题。
Promise
有三种状态:
- pending(进行中):初始状态,表示异步操作还未完成。
- resolved(已成功):表示异步操作成功完成。
- rejected(已失败):表示异步操作失败。
Promise
特点:
- 可链式调用:
Promise
提供了then
方法,可以通过链式调用then
方法来处理异步操作的成功和失败。这种链式调用的方式使得代码更加清晰、可读性更高。 - 错误处理:
Promise
提供了catch
方法,用于捕获链式调用中发生的错误。通过catch
方法,可以集中处理异步操作的错误,避免回调函数中的错误处理逻辑分散在各处。 - 状态不可逆:一旦
Promise
的状态变为resolved
或rejected
,就无法再次改变。这种特性保证了Promise
的状态在异步操作完成后是确定的,不会出现不一致的情况。这也是Promise
名字的由来 ── 承诺。 - 解决了回调地狱问题:通过
Promise
的链式调用,可以避免传统回调函数方式中的嵌套问题,使代码更加结构化、可读性更高。
Promise
优点:
Promise
通过链式调用和错误处理机制,提供了更清晰、结构化的异步编程方式,使代码可读性更高。链式调用解决了传统回调函数方式中的回调地狱问题,使代码更加可读、易于维护。
Promise
缺点:
- 无法取消
Promise
,一旦新建它就会立即执行,无法中途取消。 - 如果不设置回调函数,
Promise
内部抛出的错误,不会反应到外部。 - 当处于
pending
状态时,无法得知目前进行到哪一个阶段了(开始或完成)
注:状态的改变是通过 resolve()
和 reject()
函数来实现的,可以在异步操作结束后调用这两个函数改变 Promise
实例的状态,它的原型上定义了一个 then
方法,使用这个 then
方法可以为两个状态的改变注册回调函数。这个回调函数属于微任务,会在本轮事件循环的末尾执行。另外,在构造 Promise
时,构造函数内部的代码是立即执行的。
相关
Promise then 第二个参数和catch的区别是什么
Promise.all 和 Promise.race 的区别和使用场景