对 Javascript 异步编程略有研究的同学会知道, Javascript 异步编程经历了三个阶段,分别是:Callback Hell、Promise 和 async/await。Callback Hell 是最古老的方式,它使用嵌套回调函数的方式实现异步编程,这种方式的函数嵌套层级可能会很深,它的代码结构看上去如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/03f9b670e1b0f4d9208d9ffa5cf72acd.png)
为了解决 Callback Hell 带来的问题,Promise 应运而生。为了方便后续的理解,先介绍一些与 Promise 相关的术语。
术语
thenable 和 non-thenable
- thenable:有 then 方法的对象,也可以称为 PromiseLike。
- non-thenable:没有 then 方法的对象
状态
promise 有三种互斥的状态:
1.fulfilled:已经被兑现了。如果 promise 的状态变成 fulfilled,那么 promise.then(f) 中的 f 会被调用。
2.rejected:已经被拒绝了。如果 promise 的状态变成 rejected,那么 promise.then(undefined, r) 中的 r 会被调用。
3.pending:promise 的初始状态,promise 的状态既不是 fulfilled 也不是 rejected。
你可能会听到有人说某个 promise 已经被 settled 了,他的意思是这个 promise 不是 pending 状态,它是 fulfilled 或者 rejected 状态。settled 不是 promise 的状态,它只是语言上的便利。
promise 的状态一旦确定就不可变更,示意图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/858f663dbd4b7a0aeb3850094c9723c4.png)
通过下面的方式可以改变 promise 的状态,简化代码如下:
const myPromise = new Promise((resolve, reject) => {//在此之前 promise 的状态是 pendingresolve(someValue)// line A。promise 的状态会变成 fulfilled?maybe// orreject("failure reason")// lineB。promise 的状态变成 rejected
});
你可能已经发现,lineA 比