如果我想宣传myFunction
中的所有代码路径,我是否需要在deferred
内创建myFunction
?
function myFunction(options) {
if(!options) {
throw 'foo'; // But I want the API for myFunction to be promise-based...
}
return promiseBasedApi.doSomethingAndReturnPromise();
}
答案 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有两个方面:
启动
完成
在上文中,在请求的发起期间未能提供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?。