在 Bluebird Promise 常见问题解答中,.then(success, failed) 被标记作为反模式。这可能会令人困惑,特别是如果您不理解有关 try 和 catch 语句的解释。
.then() 调用如果回调抛出错误,则返回一个拒绝的承诺。这意味着如果成功记录器失败,错误将传递给以下 .catch() 回调,而不是伴随成功的失败回调。
.then 的控制流程有两个参数和 .then-catch 链如下所示:
[.then 和 .then-catch 的控制流程图的图像chain]
用同步代码表达这一点:
// 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); }
将其与:
// some_promise_call().then(logger.log).catch(logger.log) try { var results = some_call(); logger.log(results); } catch(e) { logger.log(e); }
在此进行比较在这种情况下,catch 记录器会处理成功记录器调用中的异常。
反对此模式的论点是,您通常应该在以下位置捕获错误:每个处理步骤并避免连锁使用。我们期望您只有一个最终处理程序来处理所有错误。
但是,在处理特定步骤中的特定错误并在没有错误发生时采取不同的操作时,此模式很有用。请注意,这会分支您的控制流。
考虑以下内容:
some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); });
或者,您可以使用 .finally() 来实现此目的。
以上是什么时候使用 `.then(success, failure)` 是 Promise 中的反模式?的详细内容。更多信息请关注PHP中文网其他相关文章!