如何转换函数调用与两个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转换为承诺?