什么时候。(成功,失败)认为是一个反模式的承诺?

我看了蓝鸟许诺常见问题 ,其中提到.then(success, fail)是一个反模式 。 对于尝试和捕捉我不太了解它的解释。 这是什么问题?

 some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) }) 

看来,这个例子是build议以下作为正确的方式。

 some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) }) 

有什么不同?

有什么不同?

.then()调用将返回一个承诺,如果callback抛出一个错误将被拒绝。 这意味着,当您的成功logger失败时,错误将被传递给下面的.catch()callback.catch() ,但不会传递给failcallback.catch() ,并且success

这是一个控制stream程图

然后用两个参数来控制流程图控制流程图的链接

用同步代码表示:

 // some_promise_call().then(logger.log, logger.log) then: { try { var results = some_call(); } catch(e) { logger.log(e); break then; } // else logger.log(results); } 

第二个log (就像.then()的第一个参数)只会在没有exception发生的情况下执行。 有标签的块和break语句感觉有点奇怪,这实际上是python已经try-except-else (推荐阅读!)。

 // some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); } 

catchlogging器还将处理成功logging器调用中的exception。

这么多差别。

对于尝试和捕捉我不太了解它的解释

我们的观点是,通常你想要在处理的每一步中发现错误,而且你不应该使用它。 期望的是,你只有一个最终的处理器来处理所有的错误 – 而当你使用“反模式”时,一些callback函数中的错误不会被处理。

然而,这种模式实际上是非常有用的:当你想要处理在这个步骤中发生的错误,并且当没有错误发生时 – 即当错误是不可恢复的时候,你想做一些完全不同的事情。 请注意 ,这是分支您的控制stream。 当然,这有时是需要的。


这是什么问题?

 some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) }) 

你必须重复你的callback。 你宁愿要

 some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); }); 

你也可以考虑使用.finally()

两者不完全相同。 不同之处在于第一个示例不会捕获您的success处理程序中抛出的exception。 所以如果你的方法只能返回已解决的promise,就像往常那样,你需要一个尾随的catch处理程序(或者另外一个空的success参数)。 当然,这可能是你的处理程序没有做任何可能失败的事情,在这种情况下,使用一个2参数then可以。

但是我相信你链接到的文本的重点是, then在链接一堆asynchronous步骤的能力方面,callback最有用,而当你真正做到这一点时, then微妙的双参数forms就不会有相当的performance正如所料,由于上述原因。 当使用中链时,这特别是违反直觉的。

作为一个做了很多复杂的asynchronous的东西,碰到这样的angular落比我更愿意承认,我真的build议避免这种反模式,并采取单独的处理程序的方法。

通过查看两者的优缺点,我们可以猜测哪种情况是适合的。 这是履行承诺的两个主要方法。 两者都有其优点和缺点

捕捉方法

 some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) }) 

优点

  1. 所有错误都由一个catch块处理。
  2. 甚至可以捕获当时的任何exception。
  3. 链接多个成功callback

缺点

  1. 在链接的情况下,很难显示不同的错误信息。

成功/错误的方法

 some_promise_call() .then(function success(res) { logger.log(res) }, function error(err) { logger.log(err) }) 

优点

  1. 你得到细粒度的错误控制。
  2. 你可以有常见的error handling函数的各种types的错误,如数据库错误,500错误等

Disavantages

  1. 如果您希望处理成功callback引发的错误,您仍然需要另一次catch