3 votes

Fonction enveloppante qui renvoie la promesse sans tenir compte des arguments de la fonction.

Dans mon projet, j'ai un scénario dans lequel j'ai différents types de fonctions avec différents arguments. L'un de ces arguments contient la fonction de rappel. Et il y a aussi un cas où la fonction n'a pas d'arguments. Comme indiqué ci-dessous :

abc(string, function, number)
aaa(function, string)
bcd()
xyz(function)
cda(string, number, function, string)

Je dois écrire une fonction telle qu'indépendamment de l'irrégularité des fonctions ci-dessus, la fonction doit retourner une promesse.

Exemple :

// Assume $q has been injected
var defer = $q.defer();
function returnPromise(functionName, functionArgumentsInArray){
    defer.resolve(window[functionName].apply(null, functionArgumentsInArray));
    return defer.promise;
}

Comme vous pouvez le voir, la fonction ci-dessus ne résout pas la fonction de rappel mais juste la fonction.

Note : Les fonctions auront un maximum d'un argument de fonction ou aucun.

Je sais que cela peut être fait individuellement pour chaque cas comme suit :

function returnPromise(){
    var defer = $q.defer();
    abc("hey", function() {
        defer.resolve(arguments);
    }, 123);
    return defer.promise;
}

Mais je cherche une enveloppe commune pour toutes ces fonctions.

3voto

Bergi Points 104242

Je pense que vous cherchez quelque chose comme

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

Vous pourriez l'utiliser comme

const abcPromised = wrap(abc);
abcPromised("hey", cbPlaceholder, 123).then(…)

Jetez également un coup d'œil à Comment convertir une API callback existante en promises ? . En général, vous ne devriez pas avoir besoin de cet emplacement lorsque toutes les fonctions promises suivent la convention de prendre le callback comme dernier paramètre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X