在 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中reject和catch的问题

Promise.catch() 不会在 AngularJS 单元测试中捕获异常

关于promise中reject和catch的问题

Promise中的then第二个参数和catch有什么区别?

Promise的catch()函数