什么时候。(成功,失败)认为是一个反模式的承诺?
我看了蓝鸟许诺常见问题 ,其中提到.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()
,但不会传递给fail
callback.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); }
catch
logging器还将处理成功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) })
优点
- 所有错误都由一个catch块处理。
- 甚至可以捕获当时的任何exception。
- 链接多个成功callback
缺点
- 在链接的情况下,很难显示不同的错误信息。
成功/错误的方法
some_promise_call() .then(function success(res) { logger.log(res) }, function error(err) { logger.log(err) })
优点
- 你得到细粒度的错误控制。
- 你可以有常见的error handling函数的各种types的错误,如数据库错误,500错误等
Disavantages
- 如果您希望处理成功callback引发的错误,您仍然需要另一次
catch