【问题标题】:How to guarantee an API user that a promise never rejects如何向 API 用户保证 Promise 永远不会拒绝
【发布时间】: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&lt;void&gt; 并将resolve(true) 部分替换为resolve() 并将resolve(false) 部分替换为reject() 解决了我的问题。

但我想知道是否有任何其他优雅的方式可以告诉 API 用户“您永远不需要附加 catch 并且您必须在 then 中准确处理这些值”。

【问题讨论】:

  • 这是一个有趣的问题,但它的答案几乎肯定不应该适用于上述问题。错误应该传播给调用者,如下所示:pastebin.com/pN83qeED 不要将失败转换为值为false 而不是true 的实现。无论如何,调用代码都必须采用两个不同的分支,所以让失败成为错误。
  • 捕获和处理错误是应用程序级别的事情。无论出于何种原因,低级实用程序可能具有中间(中链)捕获,但没有终端捕获;属于调用者或调用者的调用者或更高级别。
  • 但是....如果它是一个高级实用程序,那么可能是的。这是一个设计决定。
  • 其实API用户也是我这里:) 我正在设计一个模块,这个方法属于一些utli类。我在同一模块的某个更高级别的类中调用此方法,我可以将捕获部分留空。但是,我基本上不希望在一段时间后有人来说哦,为什么不处理这些承诺的错误情况。我想明确表示这些承诺不需要任何捕获部分。但是,我猜,承诺并不意味着这个。我需要为这种方法写一些评论或其他内容以使其易于理解..
  • @M.Yilmaz,如果您不打算处理异常,请不要添加 catch 子句。

标签: javascript typescript promise


【解决方案1】:

但我想知道有没有其他优雅的方式来告诉 API 用户“您永远不需要附加 catch 并且您必须在 then 中准确处理这些值”。

没有。类似于类型系统中没有办法说 函数永远不会抛出 的事实,promise 永远不会拒绝

如果你愿意,你唯一的选择是为这个事实添加文档?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-14
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多