【问题标题】:Promisify QT callbacks to angularjs promisePromisify QT 回调到 angularjs 承诺
【发布时间】:2018-07-19 16:49:34
【问题描述】:

我正在尝试编写一个 QT 用于 angularjs $q 承诺的 promisify 函数,但我似乎无法理解它。

QT 承诺类似于:

method(arg, arg, callback);

所以如果 C++ 有一个方法可以连接两个字符串,那么调用将是:

method('A', 'B', function(result) {
  console.log(result);  //would print 'AB'
});

我希望能够承诺这种方法,所以这样的事情会起作用:

var promiseMethod = $q.promisify(method);

promiseMethod('A', 'B')
  .then(result) {
     console.log(result);
  }

我开始添加我的装饰器,但似乎无法正确调用实际的方法:

.config(function($provide) {
      $provide.decorator('$q', function($delegate, $rootScope) {
        $delegate.qtPromisify = function(fn) {

          /// ARGH!  what goes here!, this don't work.
          return function() {
            var args = Array.prototype.slice.call(arguments);
            return $delegate(function(resolve, reject) {
              var result = fn.apply(null, args);
              resolve(result);
            });
          }
        };
        return $delegate;
      });
    })

【问题讨论】:

    标签: javascript angularjs qt promise


    【解决方案1】:

    我认为这将类似于 ES6 Promise promisify,因此假设您的回调具有以下签名:function(error, result) {} 我可以考虑这样做:

    $delegate.qtPromisify = function(fn) {
        return function() {
            var args = Array.prototype.slice.call(arguments);
            return $delegate(function(resolve, reject) {
                args.push(function(err, res) {
                        err ? reject(err) : resolve(res);
                });
                fn.apply(null, args);
            });
        };
    };
    

    这里我们只是创建了一个回调,它可以解析或拒绝并将其推送到args 数组,然后使用该数组调用apply

    或者使用 ES6

    $delegate.qtPromisify = function(fn) {
        return ([args]) => {
            return $delegate(function(resolve, reject) {
                const callback = (err, res) => (err ? reject(err) : resolve(res));
    
                fn.apply(null, [...args, callback]);
            });
        };
    };
    

    【讨论】:

    • 完美!非常感谢。我在他看到回调和应用时迷路了
    猜你喜欢
    • 2013-07-22
    • 2016-06-15
    • 2016-06-18
    • 1970-01-01
    • 2015-06-21
    • 2014-11-17
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多