promise 中的 .then(success, failure) 语法可以被视为反模式在某些情况下。让我们探讨一下原因,并将其与 .then().catch() 方法进行比较。
.then(success, failed) 返回一个如果回调函数被拒绝的 Promise抛出错误。因此,如果成功记录器失败,错误将传递给后续的 .catch() 处理程序,而不是失败回调。
在以下场景中,使用 .then( success、fail) 会出现问题:
some_promise_call() .then(function(res) { logger.log(res) }, function(err) { logger.log(err) })
如果 success 日志记录功能失败,错误将不会被 failed 捕获回调,但由链中的下一个 .catch() 处理程序执行。这可能会破坏预期的错误处理逻辑。
相反,建议的方法是分别使用 .then() 和 .catch():
some_promise_call() .then(function(res) { logger.log(res) }) .catch(function(err) { logger.log(err) })
在这种情况下,.catch() 处理程序还将捕获成功日志记录函数抛出的任何错误。这确保以一致的方式处理所有错误。
虽然 .then().catch() 语法提供了更好的错误处理,但 .then(success, failed)反模式在您想要执行以下操作的情况下非常有用:
但是,请务必记住,此模式会在控制流中引入分支,这可能并不理想在某些情况下。
代替 .then(成功,失败), .done() 或 .finally() 方法可用于一致地处理完成或错误。
// Handle errors and completion together some_promise_call() .catch(function(e) { return e; // it's OK, we'll just log it }) .done(function(res) { logger.log(res); }); // Handle completion always, regardless of errors some_promise_call() .finally(function() { logger.log('Promise completed'); });
以上是'then(success, failed)”什么时候是 Promise 的反模式?的详细内容。更多信息请关注PHP中文网其他相关文章!