Promise 的应用

11/23/2022 ES6JavaScript

# 基本用法

Promise 是类或构造函数,通过对它实例化,来完成预期的异步任务处理。

Promise 有三种状态:

  • pending(初始状态)
  • fulfilled(成功)
  • rejected(失败)
const p = new Promise((resolve, reject) => {
  // 异步任务主体部分
  resolve('success') // 或 reject('failed')
})
1
2
3
4

通过 resolve() 将状态修改为 fulfilled ,resolve(data) 可以返回数据,在 then() 回调里处理。

p.then(data => {
  // 数据处理
})
1
2
3

# Promise 的异常处理

方法一:通过 then() 的第二个参数

通过 reject() 将状态修改为 rejected, reject(error) 可以返回错误,在 then() 第二个参数回调里处理。

p.then(data => {
  // 数据处理
}, error => {
  // 错误处理
})
1
2
3
4
5

这种方式可以捕获 Promise 主体任务的错误,但是如果主体代码没有错误,然后错误发生在 then() 的成功回调,那么这种方式无法捕获错误。

方法二:通过 catch() 处理

p.then(data => {
  // 数据处理
}).catch(error => {
  // 错误处理
})
1
2
3
4
5

这种方式无论是 Promise 主体任务的错误,还是在成功回调里发生的错误,都可以捕获。

方法三:使用 try...catch

try catch 是传统的异常捕获方式,不过只能捕获同步代码的异常,无法捕获异步代码的异常。

# 常用 API

# 实例 API (原型方法)

  • then

    Promise 主体任务以及在此之前的链式调用都成功的时候,进入本次 then() 回调。

  • catch

    Promise 主体任务以及在此之前的链式调用出现异常,并且在此之前为被捕获,进入本次 catch() 回调。

  • finally

    无论前面的执行是成功或者失败,都会执行这个方法。

# 静态 API (类方法)

  • Promise.resolve

    返回一个成功状态的 Promise 实例,一般用于构建微任务。

console.log(1)
Promise.resolve().then(() => {
  console.log(2)
})
console.log(3)
// 1 3 2
1
2
3
4
5
6
  • Promise.reject

    返回一个失败状态的 Promise 实例,与 Promise.resolve 用法类似。

  • Promise.all

    此方法接受一个数组的参数,数组的每一项都是一个 Promise 实例,返回一个 Promise 对象。这个方法适用于需要并发执行任务,比如同时发送多个请求。

const p1 = new Promise()
const p2 = new Promise()
const p3 = new Promise()
const pAll = Promise.all([p1, p2, p3])
pAll.then(list => {
  // p1, p2, p3 都成功就会进入这里,list 是 p1, p2, p3 按顺序 resolve 的结果。
}).catch(() => {
  // p1, p2, p3 只要有一个错误,就会进入这里。
})
1
2
3
4
5
6
7
8
9
  • Promise.race

    这个方法与 Promise.all 类似,不过区别是只要传入的 Promise 对象,其中有一个的状态发生改变,则立即结束。一般用于竞速的场景。

Last Updated: 12/21/2022, 4:35:16 PM