包装器函数可返回承诺,而与函数参数无关



在我的项目中,我有一个场景,其中我具有不同类型的函数。这些参数之一具有回调函数。而且在某些情况下,该函数没有任何参数。如下所示:

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转换为承诺?总的来说

最新更新