我有这样的功能:
var f = function(options, successCallback, errorCallback) {
...
}
我希望将其转换为承诺。我目前的解决方案是:
var deferred = Q.defer();
f(options,
function (result) {
deferred.resolve(result);
}, function (err) {
deferred.reject(err);
}
);
return deferred.promise;
我无法使用Q.fcall,因为它需要Node.js样式的回调function(err, result) { ... }
那么,有没有办法使用Q API改进我的代码?
答案 0 :(得分:4)
不,所有这些辅助函数(基于Deferred.makeNodeResolver
)仅用于处理丑陋的节点回发。如果回调式方法已经取得了单独的成功并且错误回调,则不需要做太多额外的工作。
您可以通过删除那些不必要的闭包函数表达式来简化模式:
var deferred = Q.defer();
f(options, deferred.resolve, deferred.reject);
return deferred.promise;
您还可以使用Promise
constructor,这是创建承诺的首选方法(奖励:通过throw
捕获例外f
n):
return new Q.Promise(function(resolve, reject) {
f(options, resolve, reject);
});
甚至可以通过部分应用来缩短
return new Q.Promise(f.bind(null, options));
另请参阅通用参考:How do I convert an existing callback API to promises?