gpt4 book ai didi

javascript - 什么时候 .the(success, fail) 被认为是 promise 的反模式?

转载 作者:IT老高 更新时间:2023-10-28 13:17:04 26 4
gpt4 key购买 nike

我看过 bluebird promise FAQ , 其中提到 .then(success, fail) is an antipattern .对于 trycatch 的解释我不太明白。以下有什么问题?

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

似乎该示例表明以下是正确的方法。

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

有什么区别?

最佳答案

What's the difference?

.then() 调用将返回一个 promise ,如果回调抛出错误,该 promise 将被拒绝。这意味着,当您的成功 logger 失败时,错误将传递给以下 .catch() 回调,但不会传递给 fail 回调这与 success 并存。

这是一个控制流图:

control flow diagram of then with two arguments control flow diagram of 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);
}

第二个log(类似于.then()的第一个参数)只会在没有异常发生的情况下执行。标记的 block 和 break 语句感觉有点奇怪,这实际上是 python has try-except-else for (推荐阅读!)。

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

catch 记录器还将处理来自成功记录器调用的异常。

差别太大了。

I don't quite understand its explanation as for the try and catch

争论是,通常,您希望在处理的每个步骤中捕获错误,并且您不应该在链中使用它。期望您只有一个最终处理程序来处理所有错误 - 而当您使用“反模式”时,某些 then-callbacks 中的错误不会得到处理。

但是,这种模式实际上非常有用:当您想要处理恰好在这一步中发生的错误,并且想要在没有发生错误的情况下(即当错误发生时)完全不同不可恢复。 请注意,这是分支您的控制流。当然,有时这是需要的。


What's wrong with the following?

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

你不得不重复你的回调。你宁愿

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

您也可以考虑使用 .finally()为此。

关于javascript - 什么时候 .the(success, fail) 被认为是 promise 的反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24662289/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com