我正在尝试编写一个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;
});
})
答案 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]);
});
};
};