【问题标题】:How to convert function call with two callbacks to promise如何将带有两个回调的函数调用转换为承诺
【发布时间】:2014-12-02 22:09:46
【问题描述】:

我有这样的功能:

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 改进我的代码?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

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

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

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

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

    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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 2022-12-19
      • 2017-07-07
      • 2020-06-02
      • 1970-01-01
      • 2018-08-08
      相关资源
      最近更新 更多