在 Promise 中,使用 catch 和 then 的第二个参数有啥区别? [复制]
Posted
技术标签:
【中文标题】在 Promise 中,使用 catch 和 then 的第二个参数有啥区别? [复制]【英文标题】:In a Promise, what's the difference between using catch and the 2nd argument of then? [duplicate]在 Promise 中,使用 catch 和 then 的第二个参数有什么区别? [复制] 【发布时间】:2017-02-25 08:14:13 【问题描述】:这两种说法到底有什么区别?
funcThatReturnsAPromise()
.then(() => /* success */ )
.catch(() => /* fail */ );
funcThatReturnsAPromise()
.then(() => /* success */ , () => /* fail */ );
【问题讨论】:
***.com/questions/24662289/… 有更好的细节和答案,但我很感谢这个,因为它完全符合我提出问题的方式:) 【参考方案1】:then(..) 接受一个或两个参数,第一个用于实现 回调,第二个用于拒绝回调。如果是 省略或以其他方式作为非函数值传递,默认值 分别替换回调。默认的履行回调 简单地传递消息,而默认的拒绝回调 简单地重新抛出(传播)它收到的错误原因。抓住(..) 仅将拒绝回调作为参数,并自动 如刚才讨论的那样,替换默认的履行回调。换句话说,它等价于 then(null,..) :
p . then ( fulfilled );
p . then ( fulfilled , rejected );
p . catch ( rejected ); // or `p.then( null, rejected )`
then(..) 和 catch(..) 也创建并返回一个新的 Promise,它可以 用于表示 Promise 链流控制。如果履行或 拒绝回调有一个异常抛出,返回的承诺是 被拒绝。如果任一回调返回一个立即的、非 Promise, non-thenable 值,该值被设置为 回报的承诺。如果履行处理程序专门返回一个 promise 或 thenable 值,该值被解包并成为 返回的承诺的解决方案。
——来自“你不知道 JS,凯尔·辛普森”
【讨论】:
【参考方案2】:除了.catch(fn)
是.then(null, fn)
的快捷方式之外,您的示例中的不同之处在于
funcThatReturnsAPromise()
.then(() => /* success */ )
.catch(() => /* fail */ );
// is equivalent to
const p1 = funcThatReturnsAPromise()
const p2 = p1.then(() => /* success */ )
const p3 = p2.catch(() => /*
executed if p1 is rejected
executed if p2 is rejected
*/ )
第二个是
funcThatReturnsAPromise()
.then(() => /* success */ , () => /* fail */ );
// equivalent to
const p1 = funcThatReturnsAPromise()
const p2 = p1.then(
() => /* success */ ,
() => /*
executed if p1 is rejected
(p2 will be actually resolved by the result of this function only when p1 is rejected)
*/
);
【讨论】:
感谢您解释我只是想找到有关它如何有益的文档,如果我在 .then() 第二个参数中传递错误函数.catch(fn)
等于 .then(undefined, fn)
而不是 .then(null, fn)
。
我检查了这个实现 github.com/then/promise/blob/master/src/… 并且它是空的,不管规范 promisesaplus.com/#the-then-method 说它可以不是一个函数【参考方案3】:
.catch(foo)
等于 .then(undefined, foo)
但是您的代码示例之间存在差异:
funcThatReturnsAPromise()
.then(() => /* success case of funcThatReturnsAPromise */ )
.catch(() => /* both fail case of funcThatReturnsAPromise
and fail case of "then" function */ );
funcThatReturnsAPromise()
.then(() => /* success case of funcThatReturnsAPromise */ ,
() => /* fail case of funcThatReturnsAPromise */ );
【讨论】:
.then 的第二个参数也会在 .then 的第一个参数抛出错误时触发 不,@koo。它不是。请查看jsbin:jsbin.com/xopaqov/edit?js,console以上是关于在 Promise 中,使用 catch 和 then 的第二个参数有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Promise 的 .then 和 .catch 是如何工作的?
Promise.catch() 不会在 AngularJS 单元测试中捕获异常