宣传API

时间:2015-08-27 15:15:57

标签: javascript promise q

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

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

  return promiseBasedApi.doSomethingAndReturnPromise();
}

2 个答案:

答案 0 :(得分:2)

  

我是否需要在myFunction内创建延迟?

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

如果您的功能尚未承诺可以返回;通常情况下,如果它正在等待任何异步操作(ajax,其他一些基于promise的API等)来完成。

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

如果您在询问是否需要为未提供options的错误创建拒绝承诺,不,我不会期望API的版本。异步操作的API有两个方面:

  1. 启动

  2. 完成

  3. 在上文中,在请求的发起期间未能提供options是错误的。我希望内联异常,而不是异步错误回调。

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

答案 1 :(得分:1)

不,您的函数中不需要延迟或Promise构造函数。对于基于非承诺的API,您确实需要。即便如此,您应该not use it globally,但每个异步代码路径都有一个单独的promise功能。

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

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

  return promiseBasedApi.doSomethingAndReturnPromise();
}

另一种选择,如果你使用的是Bluebird,则可以在Promise.method包装你的投掷或(承诺)回复功能。有关相关讨论,另请参阅Should an async API ever throw synchronously?Should a Promise.reject message be wrapped in Error?