Promise 的应用
# 基本用法
Promise 是类或构造函数,通过对它实例化,来完成预期的异步任务处理。
Promise 有三种状态:
- pending(初始状态)
- fulfilled(成功)
- rejected(失败)
const p = new Promise((resolve, reject) => {
// 异步任务主体部分
resolve('success') // 或 reject('failed')
})
2
3
4
通过 resolve() 将状态修改为 fulfilled ,resolve(data) 可以返回数据,在 then() 回调里处理。
p.then(data => {
// 数据处理
})
2
3
# Promise 的异常处理
方法一:通过 then() 的第二个参数
通过 reject() 将状态修改为 rejected, reject(error) 可以返回错误,在 then() 第二个参数回调里处理。
p.then(data => {
// 数据处理
}, error => {
// 错误处理
})
2
3
4
5
这种方式可以捕获 Promise 主体任务的错误,但是如果主体代码没有错误,然后错误发生在 then() 的成功回调,那么这种方式无法捕获错误。
方法二:通过 catch() 处理
p.then(data => {
// 数据处理
}).catch(error => {
// 错误处理
})
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
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 只要有一个错误,就会进入这里。
})
2
3
4
5
6
7
8
9
Promise.race
这个方法与 Promise.all 类似,不过区别是只要传入的 Promise 对象,其中有一个的状态发生改变,则立即结束。一般用于竞速的场景。