如何转换函数调用与两个callback承诺
我有这样的function:
var f = function(options, successCallback, errorCallback) { ... }
我想把它转换成承诺。 我目前的解决scheme是这样的
var deferred = Q.defer(); f(options, function (result) { deferred.resolve(result); }, function (err) { deferred.reject(err); } ); return deferred.promise;
我不能使用Q.fcall,因为它需要一个Node.js样式的callbackfunction(err, result) { ... }
那么,有没有一种方法来改善我的代码使用Q API ?
不,所有这些帮助函数(基于Deferred.makeNodeResolver
)只是为了处理丑陋的nodeback。 如果callback风格的方法已经取得了不同的成功和错误callback,不需要做太多额外的工作。
你可以通过删除不必要的闭包函数expression式来简化你的模式:
var deferred = Q.defer(); f(options, deferred.resolve, deferred.reject); return deferred.promise;
您也可以使用Promise
构造函数 ,这是创buildpromise的首选方法(奖励:通过f
捕获exceptionthrow
n):
return new Q.Promise(function(resolve, reject) { f(options, resolve, reject); });
甚至可能缩短部分申请
return new Q.Promise(f.bind(null, options));
另请参见generics引用: 如何将现有的callbackAPI转换为承诺?