背景
在JS异步编程中,如果想要处理异步操作返回的结果,往往会用到callback回调函数。但是如果在callback中也有异步操作,就会出现嵌套回调,过深的嵌套回调会影响代码的可读性,增加代码维护难度,所以层层嵌套的回调又被称作回调地狱。
Promise可以很好地解决回调地狱。
MDN描述
一个 Promise 对象代表一个在这个 promise 被创建出来时不一定已知的值。它让您能够把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
一个 Promise 必然处于以下几种状态之一:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成
- 已拒绝(rejected): 意味着操作失败。
注意: 如果一个 promise 已经被兑现(fulfilled)或被拒绝(rejected),那么我们也可以说它处于已敲定(settled)状态。您还会听到一个经常跟 promise 一起使用的术语:已决议(resolved),它表示 promise 已经处于已敲定(settled)状态,或者为了匹配另一个 promise 的状态被"锁定"了。Domenic Denicola 的 States and fates 中有更多关于 promise 术语的细节可以供您参考。
使用Promise
在创建Promise对象的时候需要给Promise构造函数传递一个excutor执行器函数,该函数包括两个函数参数,resolve和reject,这两个参数在调用时分别会将Promise对象的状态转变为fulfilled或rejected。
let p = new Promise((resolve, reject) => {
// some codes
if ( /** 异步操作成功 **/ ) {
resolv