【问题标题】:Promisifying an API承诺 API
【发布时间】:2015-11-22 01:33:39
【问题描述】:

如果我想promisify myFunction 中的所有代码路径,是否需要在myFunction 中创建deferred

function myFunction(options) {
  if(!options) {
    throw 'foo'; // But I want the API for myFunction to be promise-based...
  } 

  return promiseBasedApi.doSomethingAndReturnPromise();
}

【问题讨论】:

    标签: javascript promise q


    【解决方案1】:

    不,您的函数中不需要 deferred 或 Promise 构造函数。对于非基于承诺的 API,您确实需要那些 only。即使这样,您也应该 not use it globally,但要为每个异步代码路径提供单独的承诺功能。

    在你的情况下,你应该只返回一个被拒绝的承诺而不是抛出:

    function myFunction(options) {
      if (!options) {
        return Promise.reject(new FooError()); // as promised!
      } 
    
      return promiseBasedApi.doSomethingAndReturnPromise();
    }
    

    如果您使用的是 Bluebird,另一种选择是将您的 throwing-or-(promise)-returning 函数包装在 Promise.method 中。另见Should an async API ever throw synchronously?Should a Promise.reject message be wrapped in Error? 进行相关讨论。

    【讨论】:

      【解决方案2】:

      我需要在myFunction 内部创建一个延迟吗?

      (这是 jQuery 术语,一般情况是“我需要在我的函数中创建一个 Promise 吗?”)

      只有如果你的函数还没有承诺它可以返回;通常,如果它正在等待任何异步操作(ajax、其他一些基于 Promise 的 API 等)完成。


        if(!options) {
            throw 'foo'; // But I want the API for myFunction to be promise-based...
        }
      

      如果您询问是否需要针对未提供 options 的错误创建拒绝承诺,不,我不希望 API 会这样。异步操作的 API 有两个方面:

      1. 启动

      2. 完成

      在上述情况下,未能提供options 是请求初始化期间的错误。我希望是内联异常,而不是异步错误回调。

      错误处理请求(HTTP失败等)将是我期望通过promise的拒绝机制出现的错误。

      【讨论】:

      • 其实我正在使用 q 库,所以我从那里拿起它。所以如果我想完全“承诺”这个函数,那么我需要在例外情况下返回一个被拒绝的承诺(@ 987654325@)?你知道在 q 中是否有一个简写方式来做到这一点? (点重新启动和完成),但这个问题仍然存在。)
      • @BenAston:如果您使用的是特定库,最好提及或标记。我的观点是,您不需要为上述内容返回被拒绝的承诺;我会在你做的时候抛出一个异常(见我回答的后半部分,我可能在你写评论时添加了)。恐怕我对 Q 库的细节无能为力,但大多数 Promise 库都有创建被拒绝 Promise 的方法。
      • 启动与完成的概念。这是你自己的想法还是来自一本书(如果有,是哪一本)?
      • @BenAston:我不认为这是我编造的,但也不是来自一本书。这只是异步处理的本质:启动、处理、完成。只有第一个和最后一个真正有 API 存在。 :-)
      • “那是 jQuery 术语” - 公平地说,不仅仅是 jQuery。其他一些库提供延迟。 Q 就是这样一个库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 2020-03-10
      • 2017-09-03
      • 2021-06-13
      相关资源
      最近更新 更多