承诺一个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();
}
我需要在
myFunction
中创建一个延迟吗?
(这是jQuery术语,一般情况下是"我需要在我的函数中创建一个承诺吗?")
只有,如果你的函数没有一个承诺,它可以返回;通常,如果它在等待任何异步操作(ajax,其他基于promise的API等)完成,它会这样做。
if(!options) { throw 'foo'; // But I want the API for myFunction to be promise-based... }
如果你问你是否需要为没有提供options
的错误创建一个拒绝承诺,不,我不期望API。异步操作的API有两个方面:
- 开始
- 完成
在上面的例子中,在初始化请求期间,没有提供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应该同步抛出吗?和应该一个承诺。拒绝消息被包装在错误中?相关讨论
相关文章:
- RxjsObservable:通过一个API调用订阅不同的值
- 是否有一个 API 来控制火狐附加组件 SDK 中的下载
- 我开发了一个api,我希望它重定向到其他php页面,并在我点击api文件中的按钮时弹出模态
- 从 API 中调用另一个 API
- 我有一个API,我想从api响应中获取数据
- 如何在angularjs中使用第一个api的结果,进入第二个api调用
- 任何只有一个API支持桌面和移动的Javascript框架
- 向一个API发出多个请求,该API每分钟只能处理20个请求
- 一个API服务限制我或我的巨型循环对于我的POST请求来说太快了
- jQuery插件-提供一个API
- 从另一个API调用谷歌地图信息窗口
- 使用一个API调用检索ember数据关系
- 渲染没有被一个API调用,而被另一个API调用
- Angellist API访问-注册一个API
- 是否有一个API来获得Chrome扩展用户的谷歌帐户
- 承诺一个API
- 我如何使用已由另一个api设置的变量,在我的javascript函数
- 是否有一个API为chrome://web内部/变量在javascript
- 从PhantomJS启动另一个API
- 如何创建一个API来抓取特定的网页