帮你弄懂Promise原型方法then, catch, finally

🍗 饿了,就去吃好吃的;困了,就早点去睡;累了,就好好休息;不要自己太大的压力。


Promise 原型方法

Promise 构造函数的原型上实现了then, catch, finally方法,也就意味着每个 Promise 实例都都可以直接调用这样 3 个方法。

另外提一下 Promise 构造函数上实现了all, race, reject, resolve, allSettled, any 方法,这些方法只属于 Promise 构造函数自己,是不能在实例中被调用的(也就是只会以这种形式出现:如 Promise.all()

在这里插入图片描述

Promise.prototype.then()

then() 方法可以处理 Promise 被接受或拒绝的情况。

🔖 参数

then(onFulfilled, onRejected) 最多可以接受两个参数 (回调函数):

onFulfilled

Promise 变成接受状态 (fulfilled) 时调用的函数。该函数有一个参数,即接受的最终结果 (the fulfillment value)

// then()方法的第一个参数,用来处理接受状态的Promise
Promise.resolve(1)
.then((res) => {
	console.log(res) //1
})

如果该参数 (指的是onFulfilled) 不是函数,则会在内部被替换为 (x) => x,即原样返回 promise 最终结果 (后面会讨论 then 方法的返回值)。

Promise.resolve(1).then(5);
Promise.resolve(1).then();
//与下面的代码是等价的:
Promise.resolve(1).then((x) => x);

注意:参数不是函数也 包括没有参数 (即 undefined) 的情况!下图说明了这 3 种情况:

在这里插入图片描述

onRejected

1)当 Promise 变成拒绝状态 (rejected) 时调用的函数。该函数有一个参数,即拒绝的原因 (rejection reason)

// then()方法的第二个参数,用来处理拒绝状态的 Promise
Promise.reject(2)
.then(()=>{},
(reason)=>{
	console.log(reason) //2
})

2)如果该参数 (指的是 onRejected) 不是函数,则会在内部被替换为一个 "Thrower" 函数 (it throws an error it received as argument),也就是会报错。

Promise.reject(2).then(()=>{},5);
Promise.reject(2).then(()=>{});

注意:同理,这里说的参数不是函数也 包括没有参数 (即 undefined) 的情况:
在这里插入图片描述


🔖 返回值

这里的返回值指的是 then() 的返回值,是链式调用的基础。

Promise 完成 (fulfilled) 或者失败 (rejected) 时,会异步调用返回函数,返回一个 Promise 对象,不过返回值与 then() 方法中的回调函数是有关系的,如果 then() 的回调函数:

1. 没有返回任何值

那么 then 返回一个接受状态的 Promise,并且该接受状态回调函数的参数值为 undefined

也就是说在处理 then() 返回的 Promise 的回调函数中参数是 undefined,不理解就看下面的例子:

Promise.resolve(1).then(res=>{})
// 这里 then() 中的回调函数没有返回任何值,看看结果吧:

在这里插入图片描述

下面的例子可能对你理解第二句话有帮助 (后面的几种情况都与此类似,都举例说明了):

Promise.resolve(1)
.then(res=>{})
.then(param=>{
	console.log('参数',param)
})
//这里试着打印下参数,看下结果吧:

在这里插入图片描述

2. 返回一个值

那么 then 方法返回一个接受状态的 Promise ,并且将返回的值作为接受状态的回调函数 (onFulfilled) 的参数值。

Promise.resolve(1)
.then(res=>{ return 6 })

Promise.resolve(1)
.then(res=>{ return 6 })
.then(param=>{
	console.log('参数',param)
})

在这里插入图片描述

3. 抛出一个错误

那么 then 返回一个拒绝状态的 Promise,并且将抛出的错误作为拒绝状态的回调函数 (onReject) 的参数值。

Promise.resolve(1).then(()=>{
	throw new Error('Oops,Error')
})

//因为是拒绝,这次要用then()的第二个参数捕捉原因
Promise.resolve(1).then(()=>{
	throw new Error('Oops,Error')
}).then(null,reason=>{
	console.log(reason)
})

在这里插入图片描述
后面三种是分别返回不同状态的 Promise

4. 返回一个接受状态的 Promise

那么 then 也会返回一个接受状态的 Promise,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的 Promise 的接受状态回调函数的参数值。

Promise.resolve(1).then(()=>{
	return Promise.resolve(3)
})

Promise.resolve(1).then(()=>{
	return Promise.resolve(3)
}).then(param=>{
	console.log('参数',param)
})

在这里插入图片描述

⒌ 返回一个拒绝状态的 Promise

那么 then 也会返回一个拒绝状态的 Promise,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的 Promise 的拒绝状态回调函数的参数值。

Promise.resolve(1).then(()=>{
	return Promise.reject(5)
})

//因为是拒绝状态,要用then()的第二个参数捕捉原因
Promise.resolve(1).then(()=>{
	return Promise.reject(5)
}).then(null,param=>{
	console.log('参数',param)
})

在这里插入图片描述

⒍ 返回一个未定状态 (pending) 的 Promise

那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的。

function func(){
	return new Promise((resolve,reject)=>{
		setTimeout(()=>{
			resolve('过了两秒')
		},2000)
	})
}

func()

示例中延时返回以得到 pending 状态的 Promise,立即查看就得到还未有返回值的 pending 状态,2秒钟之后就能看到有返回值的终态

在这里插入图片描述

也可以试着用 then() 方法捕捉一下参数:

func().then(param=>{
	console.log('参数',param)
})

在这里插入图片描述

在这里插入图片描述

Promise.prototype.catch()

catch() 方法用来处理 Promise 被拒绝的情况,相当于 then(undefined, onRejected)

🔖 参数

catch() 接受一个参数 (回调函数):

onRejected

1)当 Promiserejected 时调用的函数。 该函数拥有一个参数 reason (rejection 的原因)

2)如果这个参数 (指的是 onRejected) 不是函数时,也是会报错的。这与 then() 方法中第二个参数不是函数的情况吻合。


🔖 返回值

如果 catch() 中的回调函数抛出一个错误返回一个本身失败的 Promise, 则返回一个 rejected 状态的 Promise;其他情况返回 resolved 状态的 Promise

在这里插入图片描述

🔖 catch() 链式调用参考

在这里插入图片描述

Promise.prototype.finally()

要点理解

  1. finally 方法用来指定在 promise 结束时,无论结果是 fulfilled 或者是 rejected,都会执行的回调函数。这样可以避免同样的语句需要在 then()catch() 中都要写一次的情况。
    如果你想在 promise 执行完毕后无论其结果怎样都做一些处理或清理时,finally() 方法可能是有用的。
  2. finally 方法的回调函数不接受任何参数,这意味着没有办法知道前面的 Promise 状态到底是 fulfilled 还是 rejected。这表明finally 仅用于无论最终结果如何都要执行的情况,而不能依赖 Promise 执行结果。
  3. finally 方法本身无异常抛出的情况下,总是会返回原来的 Promise 对象值;若抛出异常,则返回异常的 Promise 对象。

Promise 的三种状态

一个 Promise 只有可能是以下 3 个状态:pending 待定fulfilled 已兑现rejected 已拒绝

关于 resolved
在第一次写下这篇文章的时候,谷歌浏览器中已兑现的 Promise[[PromiseStatus]] 确是 resolved,但在今天重新整理这篇文章的时候就是 fulfilled 状态。应该是根据规范在实现上做了调整。

在这里插入图片描述

  • 19
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: promise的then方法用于处理promise对象的成功状态,它接收一个回调函数作为参数,当promise对象成功时,then方法会调用该回调函数promisecatch方法用于处理promise对象的失败状态,它接收一个回调函数作为参数,当promise对象失败时,catch方法会调用该回调函数promisefinally方法用于在promise对象无论成功或失败都会执行的操作,它接收一个回调函数作为参数,当promise对象无论成功或失败时,finally方法都会调用该回调函数。 ### 回答2: promise对象是用于处理异步操作结果的,它有一个then方法和一个catch方法,还有一个可选的finally方法。 首先,then方法用于处理promise对象的成功状态。当promise对象成功解决时,then方法会被调用,我们可以在then方法中指定一个回调函数来处理成功的结果。这个回调函数接收promise对象成功时的解决值作为参数,并返回一个新的promise对象。通过链式调用多个then方法,我们可以实现多个异步操作的顺序执行。 其次,catch方法用于处理promise对象的失败状态。当promise对象被拒绝时,即出现错误或异常,catch方法会被调用。我们可以在catch方法中指定一个回调函数来处理失败的原因,并返回一个新的promise对象。与then方法类似,catch方法也可以通过链式调用多个catch方法,以处理不同的失败情况。 最后,finally方法可选的。它会在promise对象无论是成功还是失败后都被调用。无论是在then或catch方法中返回的promise对象是解决还是拒绝,finally方法都会在最后被调用。我们可以在finally方法中执行一些清理操作,比如关闭资源或释放内存。 总结来说,then方法用于处理promise对象的解决状态,catch方法用于处理promise对象的拒绝状态,finally方法可选的用于在最后执行一些清理操作。通过这三个方法的灵活组合使用,我们可以更好地管理和处理异步操作的结果。 ### 回答3: promise的then方法catch方法Promise对象上的方法,用于处理异步操作的结果或捕获异常。 then方法可以接受两个参数——onFulfilled(成功时的回调函数)和onRejected(失败时的回调函数)。当一个Promise对象的状态变为fulfilled(成功)时,then方法会执行onFulfilled回调函数;当一个Promise对象的状态变为rejected(失败)时,then方法会执行onRejected回调函数。其中,onFulfilled和onRejected都是可选参数,可以根据实际需求只传入其中一个。 catch方法用于捕获Promise对象内部抛出的异常。它是then方法的语法糖,相当于只传递onRejected回调函数的then方法。当一个Promise对象的状态变为rejected(失败)时,catch方法会执行传入的回调函数,用于处理异常情况。 finally方法Promise对象的另一个方法,它接受一个回调函数作为参数。不管Promise对象的状态是fulfilled(成功)还是rejected(失败),finally方法都会执行传入的回调函数。该回调函数无论如何都会被执行,用于处理一些需要在Promise结束时执行的逻辑,比如清理工作。 总结来说,then方法用于处理Promise对象的成功和失败状态,catch方法用于捕获异常,finally方法用于执行一些无论Promise对象状态如何都需要执行的操作。这三个方法的链式调用可以有效地处理异步操作的结果,并进行必要的处理和清理工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值