Skip to content

Promise

Promise 是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。Promise 的基本语法如下:

js
// 创建 Promise
const promise = new Promise((resolve, reject) => {
  // 异步操作
  if (success) {
    resolve(value) // 状态变为 fulfilled
  } else {
    reject(error)  // 状态变为 rejected
  }
})

Promise 有三种状态:

  1. pending(等待中)

  2. fulfilled(已成功)

  3. rejected(已失败)

当 Promise 状态变为 fulfilled 或 rejected 时,会触发相应的回调函数。

核心方法

then()

方法:then()

js
promise.then(
  value => { /* 成功处理 */ },
  error => { /* 可选失败处理 */ }
)

失败处理是可选了,一般写法为 promise.then(res => { [方法体] }) ,对于调用 reject 方法出现的 失败 一般都使用专门的 catch() 回调函数

catch()

方法:catch()

js
promise.catch(error => { /* 错误处理 */ })

等效写法

js
promise.catch(onRejected) 
// 等同于
promise.then(null, onRejected)

finally()

方法:finally()

无论成功还是失败,最终都会执行 finally 方法体

js
promise.finally(() => { /* 方法体 */ })

链式调用

js
new Promise((resolve, reject) => resolve())
    .then(res => new Promise((resolve, reject) => resolve()))
    .then(res => new Promise((resolve, reject) => resolve()))
    .then(res => new Promise((resolve, reject) => resolve()))
    .then(res => new Promise((resolve, reject) => resolve()))
    .then(res => console.log(res))

静态方法

all

等待所有 Promise 完成,或任意一个 Promise 失败。最终得到一个包含所有的 Promise 结果的数组

js
let arr = [
    new Promise((resolve, reject) => resolve(1)),
    new Promise((resolve, reject) => resolve(2)),
    new Promise((resolve, reject) => resolve(3))
]
Promise.all(arr).then(res => console.log(res)) // [1, 2, 3]

allSettled

跟 all 不同的是 all 只要有一个失败,那么就会立即 reject,无法获取其他成功的结果。allSettled 则是会等待所有的 Promise 都结束然后才返回每个 Promise 的执行结果

js
let arr = [
    new Promise((resolve, reject) => resolve(1)),
    new Promise((resolve, reject) => reject(2)),
    new Promise((resolve, reject) => resolve(3))
]
Promise.allSettled(arr).then(res => console.log(res))

返回结果

js
[
  { status: 'fulfilled', value: 1 },
  { status: 'rejected', reason: 2 },
  { status: 'fulfilled', value: 3 } 
]

allSettled 的返回值始终都为 resolve

race

返回最先完成(无论成功或失败)的 Promise 的结果

js
let arr = [
    new Promise((resolve, reject) => resolve(1)),
    new Promise((resolve, reject) => reject(2)),
    new Promise((resolve, reject) => resolve(3))
]
Promise.race(arr).then(res => console.log(res)) // 1

resolve/reject

快速创建已解决或已拒绝的 Promise

js
// 已解决
Promise.resolve("成功")
new Promise((resolve, reject) => resolve("成功"))

// 已拒绝
Promise.reject("失败")
new Promise((resolve, reject) => reject("失败"))

async/await

async/await 是 JS 中用于处理异步操作的一种语法糖(即更简洁的写法),它基于 Promise 实现

  • async:用于声明一个函数为异步函数。当函数被调用时,会返回一个 Promise
  • await:用于等待一个 Promise 的完成。只有在异步函数内部才能使用 await

async/await 的基本语法如下:

js
async function fun() {
    await doSomething()
}

在使用语法糖的情况下:

  • return 任意值 → 等价于 Promise.resolve(值)
  • throw 任意值 → 等价于 Promise.reject(值)(需要确保抛出内容不会被捕获,否则返回状态会变为成功态