承诺 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:
有两个方面
启蒙
完成
在上面,未能提供 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? 中以供相关讨论。
如果我想在 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:
启蒙
完成
在上面,未能提供 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? 中以供相关讨论。