如何将具有两个回调的函数调用转换为promise



我有一个这样的函数:

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.call,因为它需要Node.js风格的回调function(err, result) { ... }

那么,有没有一种方法可以使用Q API改进我的代码?

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

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

var deferred = Q.defer();
f(options, deferred.resolve, deferred.reject);
return deferred.promise;

您也可以使用Promise构造函数,这是创建承诺的首选方法(奖金:通过f捕获异常thrown):

return new Q.Promise(function(resolve, reject) {
    f(options, resolve, reject);
});

其甚至可能随着的部分应用而缩短

return new Q.Promise(f.bind(null, options));

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

相关内容

  • 没有找到相关文章

最新更新