承诺 API

Promisifying an API

如果我想在 myFunction 中承诺所有代码路径,我是否需要在 myFunction 中创建一个 deferred

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

  return promiseBasedApi.doSomethingAndReturnPromise();
}

do I need to create a deferred inside myFunction?

(这是 jQuery 术语,一般情况下是 "Do I need to create a promise in my function?")

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


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

如果您询问是否需要为未提供 options 的错误创建拒绝承诺,不,我不希望 API。异步操作的 API:

有两个方面
  1. 启蒙

  2. 完成

在上面,未能提供 options 是请求 启动 期间的错误。我期望内联异常,而不是异步错误回调。

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

不,您的函数中不需要延迟或 Promise 构造函数。对于非基于承诺的 API,您确实需要 only。即使那样,您也应该 ,但每个异步代码路径都有单独的承诺能力。

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

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

  return promiseBasedApi.doSomethingAndReturnPromise();
}

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