什么是Promise?

84 阅读2分钟

Promise

Promise是ES6新增的一个类,可以翻译为承诺、期约

当通过new创建Promise实例时,需要传入一个回调函数,我们称之为executor(执行人)

  • 这个回调函数会被立刻执行,并传入两个回调参数resolve(解决)、reject(拒绝)
  • 当调用resolve回调函数时,会执行 Promise 对象的then方法传入的回调
  • 当调用reject回调函数时,会执行 Promise 对象的catch方法传入的回调

Promise是一个状态机,分为 3 种状态:

  • pending:待定状态,执行了 executor 后,处于该状态

  • fulfilled:兑现状态,调用resolve()后,Promise 的状态更改为 fullfilled,且无法再次更改

  • rejected:拒绝状态,调用reject()后,Promise 的状态更改为 rejected,且无法再次更改

function request() {
  const flag = Math.random() <= 0.5 ? true : false
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (flag) {
        resolve('成功的消息')
        return
      }
      reject('失败的消息')
    }, 2000)
  })
}

console.log('请求开始')
request()
  .then(msg => console.log(msg), err => console.log(err))

通过then方法可以对 Promise 中的resolve进行处理。then方法的返回值是一个 Promise 实例

除了then方法的第二个参数来捕获reject错误之外,还可以通过catch方法,catch 返回一个 Promise

finally 是 ES9(ES2018) 新增的一个特性,无论一个Promise实例是fulfilledrejectedfinally都会执行。

all 方法

Promise.all()接收一个Promise[],返回一个Promise实例,当所有的 Promise 执行完毕并且都是fulfilled时,该实例的状态才会变为fulfilled,只要队列中有一个实例的状态是rejected,那么该实例的状态也会变为rejected

如果 Promise 队列中所有的实例状态都是fulfilled,那么Promise.all()返回的实例的状态就会变为fulfilled,并且resolve()的参数(应该是then?)是一个数组,按照顺序放置队列中每个 Promise 成功后的结果

本文为学习笔记,内容来自JavaScript高级深入浅出:Promise 详解 - 掘金 (juejin.cn)