如何将函数调用与两个回调转换为promise

bni*_*dyc 5 javascript node.js promise q

我有这样的功能:

var f = function(options, successCallback, errorCallback) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我想把它转换成一个承诺.我目前的解决方案是:

var deferred = Q.defer();

f(options,
    function (result) {
        deferred.resolve(result);
    }, function (err) {
        deferred.reject(err);
    }
);

return deferred.promise;
Run Code Online (Sandbox Code Playgroud)

我不能使用Q.fcall,因为它需要一个Node.js样式的回调 function(err, result) { ... }

那么,有没有办法使用Q API改进我的代码?

Ber*_*rgi 4

不,所有这些辅助函数(基于Deferred.makeNodeResolver)只是为了处理丑陋的节点。如果回调式方法已经采用单独的成功和错误回调,则不需要做太多额外的工作。

您可以通过删除那些不必要的闭包函数表达式来简化您的模式:

var deferred = Q.defer();
f(options, deferred.resolve, deferred.reject);
return deferred.promise;
Run Code Online (Sandbox Code Playgroud)

您还可以使用Promise构造函数,这是创建 Promise 的首选方法(好处:throw通过 捕获异常 n f):

return new Q.Promise(function(resolve, reject) {
    f(options, resolve, reject);
});
Run Code Online (Sandbox Code Playgroud)

甚至可以通过部分应用来缩短

return new Q.Promise(f.bind(null, options));
Run Code Online (Sandbox Code Playgroud)

另请参阅通用参考:如何将现有回调 API 转换为 Promise?