J'ai un morceau de code:compréhension du générateur de Javascript
function * input(){
let array = [];
while(true) {
array.push(yield array);
}
}
var gen = input();
console.log(gen.next("A"))
console.log(gen.next("B"))
console.log(gen.next("C"))
console.log(gen.next("D"))
Lorsque vous exécutez vous obtiendrez la sortie suivante:
{ value: [], done: false }
{ value: [ 'B' ], done: false }
{ value: [ 'B', 'C' ], done: false }
{ value: [ 'B', 'C', 'D' ], done: false }
Pourquoi la première ligne du résultat ne comprend pas A
dans le tableau? Il y a une explication de cette page au https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#Passing_arguments_into_Generators. Le commentaire dit
le premier appel de la prochaine() effectue depuis le début de la fonction jusqu'à ce que la première instruction yield
Mais de mon test, il ne semble pas correct. Mon code de test est:
function* logGenerator() {
console.log("before yield in function");
yield 1;
console.log("filler 1");
yield 2;
console.log("filler 2");
yield 3;
console.log("filler 3");
}
var gen = logGenerator();
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
console.log("-----------------");
console.log(gen.next());
Le résultat est:
before yield in function
{ value: 1, done: false }
-----------------
filler 1
{ value: 2, done: false }
-----------------
filler 2
{ value: 3, done: false }
-----------------
filler 3
{ value: undefined, done: true }
Comme vous pouvez le voir, la première next()
non seulement exécuté les déclarations avant le premier yield
, mais aussi la première déclaration yield
. Donc cette théorie ne peut pas expliquer ma question. Quelqu'un peut-il aider à me diriger dans la bonne direction? Merci d'avance.
L'opérateur de rendement doit avoir préséance. –
C'est intéressant. en cours d'exécution 'console.log (gen.next());' donne d'abord la sortie attendue –