2017-10-19 17 views
0

Je me penche sur les promesses en construisant une version piétonne pour comprendre ce qui se passe, il suffit de dire que je suis coincé à un point où il faut vérifier si la fonction executor a été transmise au constructor qui a un resolve et reject comme arguments.Comment obtient-on le nom des arguments d'une fonction passée à une fonction en JavaScript?

Ceci provient du test.

it('gets called with two different functions (funception!), resolve and reject', function() { 
     var promise = new $Promise(executor); // eslint-disable-line no-unused-vars 
     var argsPassedIntoExecutor = executor.calls.argsFor(0); 

     expect(argsPassedIntoExecutor.length).toBe(2); 
     var resolve = argsPassedIntoExecutor[0]; 
     var reject = argsPassedIntoExecutor[1]; 

     expect(typeof resolve).toBe('function'); 
     expect(typeof reject).toBe('function'); 
     expect(resolve).not.toBe(reject); 
    }); 

Ce que j'ai jusqu'ici:

function $Promise(fnc) { 
    if (typeof arguments[0] !== 'function') { 
    throw new TypeError('Sorry argument passed to $Promise should an executor function'); 
    } 

    function ArgumentsToArray(args) { 
    return [].slice.apply(args); 
    } 

    console.log(ArgumentsToArray.apply(fnc)); 

    this._state = 'pending'; 
    this._value = null; 
    this._internalResolve = function(data) { 
    if (this._state !== 'pending') return; 
    this._value = data; 
    this._state = 'fulfilled'; 
    }; 
    this._internalReject = function(data) { 
    if (this._state !== 'pending') return; 
    this._value = data; 
    this._state = 'rejected'; 
    }; 

    return fnc(); 
} 

C'est ce que j'ai essayé (extrait ci-dessus), mais en vain:

function ArgumentsToArray(args) { 
    return [].slice.apply(args); 
    } 

    console.log(ArgumentsToArray.apply(fnc)); 

Toute aide sera appréciée!

+0

WTH est-ce que 'ArgumentsToArray' est supposé faire? Vous n'avez pas à traiter avec des tableaux n'importe où? Passez simplement les fonctions du résolveur comme arguments lors de l'appel de 'fnc()'. – Bergi

Répondre

1

Pour votre question, les arguments nommés n'existent pas en javascript, ce que nous avons c'est la fonction arité (avec des réserves) avec la propriété length et la déstructuration des arguments. Il n'y a donc aucun moyen de tester les "noms des arguments". Pour votre test, vous pouvez faire:

const spy = (resolve, reject) => { 
    expect(typeof resolve).toBe("function"); 
    expect(typeof resolve).toBe("function"); 

}; 

Et passez cet espion à votre constructeur.

Ceci est un effort intéressant, mais vous devriez essayer et commencer à partir de la spécification. Le constructeur Promise introduit par la spécification est là principalement pour la découvrabilité (avec la propriété constructor).

Voici les spécifications: https://promisesaplus.com/, juste essayer de comprendre et réimplémenter une procédure simple resolve pour le démarreur, les spécifications ont une suite de tests pour vous aider (distrubuted comme un paquet npm).