在我的项目中,我有一个场景,其中我具有不同类型的函数。这些参数之一具有回调函数。而且在某些情况下,该函数没有任何参数。如下所示:
abc(string, function, number)
aaa(function, string)
bcd()
xyz(function)
cda(string, number, function, string)
我需要编写一个函数,使得无论上述功能的不规则性如何,该功能都应返回承诺。
示例:
// Assume $q has been injected
var defer = $q.defer();
function returnPromise(functionName, functionArgumentsInArray){
defer.resolve(window[functionName].apply(null, functionArgumentsInArray));
return defer.promise;
}
如您所见,上面的函数无法解析回调函数,而只是函数。
注意:函数将具有一个函数参数或无最大值。
我知道可以单独完成每种情况,如下:
function returnPromise(){
var defer = $q.defer();
abc("hey", function() {
defer.resolve(arguments);
}, 123);
return defer.promise;
}
,但我正在寻找所有此类功能的普通包装。
我认为您正在寻找
之类的东西const cbPlaceholder = Symbol("placeholder for node callback");
function wrap(fn) {
return function(...args) {
return $q((resolve, reject) => {
function nodeback(err, result) {
if (err) reject(err);
else resolve(result);
}
for (var i=0; i<args.length; i++)
if (args[i] === cbPlaceholder) {
args[i] = nodeback;
break;
}
const res = fn.apply(this, args);
if (i == args.length) // not found
resolve(res);
});
};
}
您可以将其用作
const abcPromised = wrap(abc);
abcPromised("hey", cbPlaceholder, 123).then(…)
还可以查看如何将现有的回调API转换为承诺?总的来说