Promise 基础,包括状态、基础 API、静态方法、链式调用和 async/await。

2022-09-15 03:35:27

Promise 的作用

Promise 是一套专门处理异步场景的规范,能有效避免回调地狱的产生,使异步代码更加清晰、简洁、统一。

Promise 并没有消除回调,而是消除了回调地狱。它能使用链式编程,让异步调用有序进行。

有了 Promise,异步任务就有了统一处理的方式。有了统一的方式之后,就可以进行进一步的优化。

Promise/A+ 规范

Promise/A+ 主要规定了 Promise 对象、状态流转和后续处理方式。

所有异步场景,都可以看作是一个异步任务。每个异步任务在 JavaScript 中应该表现为一个对象,这个对象被称为 Promise 对象

Promise 的状态

每个 Promise 对象都有三种状态:

  • pending:挂起
  • fulfilled:完成
  • rejected:失败

任务总是从挂起状态变更到完成/失败状态,无法逆行。

挂起 -> 完成 的过程称为 resolve; 任务完成时,可能会有一个相关数据;

挂起 -> 失败 的过程称为 reject。 任务失败时,可能会有一个失败原因。

可以对任务进行后续处理,针对完成的后续处理称为 onFulfilled。针对失败的后续处理称为 onRejected

基础 API

创建 Promise

可以通过 new Promise() 创建一个异步任务。

const p = new Promise((resolve, reject) => {
  resolve('成功')
  // reject('失败')
})

then

then() 用于注册 Promise 完成或失败后的处理函数。

p.then(
  (data) => {
    console.log(data)
  },
  (reason) => {
    console.log(reason)
  }
)

catch

catch() 用于处理失败状态。

p.catch((reason) => {
  console.log(reason)
})

finally

finally() 无论任务完成还是失败都会执行。

p.finally(() => {
  console.log('任务结束')
})

静态方法

  • Promise.resolve():返回一个完成状态的 Promise
  • Promise.reject():返回一个拒绝状态的 Promise
  • Promise.all():全部成功才成功,有一个失败就失败
  • Promise.any():有一个成功就成功,全部失败才失败
  • Promise.race():谁先完成就以谁的结果为准
  • Promise.allSettled():等待所有任务都有结果,不关心成功或失败

链式调用

then() 方法会返回一个新的 Promise,因此可以继续调用 then()

Promise.resolve(1)
  .then(data => data + 1)
  .then((data) => {
    console.log(data)
  })

async / await

async

async 关键字用于修饰函数,被它修饰的函数一定会返回一个 Promise

async function fn() {
  return 1
}

fn() // Promise { 1 }

await

await 表示等待某个 Promise 完成,必须用于 async 函数中

async function fn() {
  const data = await Promise.resolve(1)
  console.log(data)
}