Promise
对象用于表示一个异步操作的最终完成(或失败)及其结果值。
1.Promise的作用
- 执行异步操作
- 解决回调地狱问题
- 并发请求(Promise.all())
2.Promise的生命周期
Promise从被new出来的那一刻起,就开始了他的生命周期(Promise的状态会在[[PromiseStatus]]中体现)。初始的状态被称为Pending,这种状态表示异步操作处在挂起期,说明异步操作尚未完成。而异步操作一旦完成,会进入一下两种状态的其中一种:
1.fulfilled(已完成):表示异步操作成功结束;
2.rejected(已拒绝):表示异步操作未成功结束,期间可能发生了错误。
此时Promise的生命周期结束。(Pending -> fulfilled 或者 Pending -> rejected)
3.创建Promise
promise构造器只接收一个参数,该参数被称为执行器(executor)的函数。该函数会被传递两个参数(方法),一个叫做resolve,另一个叫做reject。
resolve函数在成功时调用,reject函数在失败时被调用。并且resolve和reject只能被使用一次,如果之后还有resolve和reject也不会被执行了,有点儿类似于return,但是不同点在于,其他代码还会被照常执行。
new Promise((resolve, reject)=> {
resolve('我是第一次调用resolve');
console.log('我是其他代码'); // 继续执行
resolve('我是第二次调用resolve'); // 不在起作用
reject('我来调用reject'); // 不在起作用
})
也可以直接使用Promise.resolve或者Promise.reject来创建成功或者失败的Promise。
let p1 = Promise.resolve('我是成功的Promise'),
p2 = Promise.reject('我是失败的Promise');
4.实例方法:then、catch、finally
then与catch方法存在于所有Promise实例上,并且返回一个Promise对象。
then接收两个参数。第一个参数是Promise状态为fulfilled(成功结束)的调用函数,第二个则是状态rejected(未成功结束)的调用函数。
new Promise()
.then(res => console.log(res), err => console.log(err))
catch接收一个参数。
new Promise()
.catch(err => {
console.log(err)
})
finally为 promise 添加一个回调函数,并返回一个新的 promise。这个新的 promise 将在原 promise 被兑现时兑现。而传入的回调函数将在原 promise 被敲定(无论被兑现还是被拒绝)时被调用。
Promise可以进行链式操作,这样可以解决回调地狱的问题。
new Promise()
.then(res => {
return res
})
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
5.静态方法
- Promise.all,可以用于并发请求。
- Promise.allSettled
- Promise.any
- Promise.race
- Promise.resolve
- Promise.reject
6.Promise的特点、优点与缺点
特点:
- Promise对象的状态不受外界的影响
- promise对象代表一个异步操作,有三种状态,pending(等待),fulfilled(成功),rejected(失败),初始状态为pending,由异步操作的结果决定状态转变为fulfilled或rejected,状态一旦改变就不会再变。
优点:
- 实现异步操作
- 解决地狱回调问题
- 用catch方法可以轻松捕获Promise回调中的错误,不影响系统运行
缺点:
- Promise无法取消,一经创建他就会立即执行,无法中途取消