【发布时间】:2020-09-23 16:18:00
【问题描述】:
我有一个 Promise 返回函数,并且该 Promise 永远不会拒绝我总是处理所有错误并仍然解决一个值。我想通知用户他/她不必将 catch 函数附加到 promise。
const createItem = (name: string): Promise<boolean> => {
return new Promise<boolean>(resolve => {
someAjaxCall().then(response => {
if (response.status >= 200 && response.status < 300) {
resolve(true);
} else {
handleError(); // some logging to console
resolve(false);
}
}).catch(error => {
handleError(); // some logging to console
resolve(false);
});
});
}
实际上将返回类型更改为Promise<void> 并将resolve(true) 部分替换为resolve() 并将resolve(false) 部分替换为reject() 解决了我的问题。
但我想知道是否有任何其他优雅的方式可以告诉 API 用户“您永远不需要附加 catch 并且您必须在 then 中准确处理这些值”。
【问题讨论】:
-
这是一个有趣的问题,但它的答案几乎肯定不应该适用于上述问题。错误应该传播给调用者,如下所示:pastebin.com/pN83qeED 不要将失败转换为值为
false而不是true的实现。无论如何,调用代码都必须采用两个不同的分支,所以让失败成为错误。 -
捕获和处理错误是应用程序级别的事情。无论出于何种原因,低级实用程序可能具有中间(中链)捕获,但没有终端捕获;属于调用者或调用者的调用者或更高级别。
-
但是....如果它是一个高级实用程序,那么可能是的。这是一个设计决定。
-
其实API用户也是我这里:) 我正在设计一个模块,这个方法属于一些utli类。我在同一模块的某个更高级别的类中调用此方法,我可以将捕获部分留空。但是,我基本上不希望在一段时间后有人来说哦,为什么不处理这些承诺的错误情况。我想明确表示这些承诺不需要任何捕获部分。但是,我猜,承诺并不意味着这个。我需要为这种方法写一些评论或其他内容以使其易于理解..
-
@M.Yilmaz,如果您不打算处理异常,请不要添加 catch 子句。
标签: javascript typescript promise