承诺对angularjs Promise的QT回调

时间:2018-07-19 16:49:34

标签: javascript angularjs qt promise

我正在尝试编写一个Promisify函数,QT将其用于angularjs $ q promise,但似乎无法解决这个问题。

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;
      });
    })

1 个答案:

答案 0 :(得分:1)

我认为这类似于ES6 Promise的工作方式,因此假设您的回调具有以下签名: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]);
        });
    };
};