承诺一个API

Promisifying an API

本文关键字:一个 API 承诺      更新时间:2023-09-26

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

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

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

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

只有,如果你的函数没有一个承诺,它可以返回;通常,如果它在等待任何异步操作(ajax,其他基于promise的API等)完成,它会这样做。


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

如果你问你是否需要为没有提供options的错误创建一个拒绝承诺,不,我不期望API。异步操作的API有两个方面:

    开始
  1. 完成

在上面的例子中,在初始化请求期间,没有提供options是一个错误。我希望是内联异常,而不是异步错误回调。

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

不,您不需要在函数中使用deferred或Promise构造函数。对于非基于承诺的api,你只需要那些。即使这样,你也不应该全局地使用它,而应该为每个异步代码路径使用一个单独的承诺功能。

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

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

如果使用Bluebird,另一种选择是在Promise.method中包装throw -or-(promise)返回函数。参见异步API应该同步抛出吗?和应该一个承诺。拒绝消息被包装在错误中?相关讨论