0
votes

JavaScript: appuyez sur les éléments dans une liste et imprimez-les avec le délai

Je veux pousser des éléments dans une liste à l'aide d'une boucle et imprimez chaque étape avec un retard. Au lieu de cela, je reçois dans chaque itération la liste complète. Je suppose que c'est un problème d'étendue, mais je ne peux pas comprendre une solution.

Voici mon code: p>

function printNumber(num,i){

    setTimeout(()=>console.log(num),500*i);
}


let numbers = [50];

for(let i=1; i<=10; i++){

    printNumber(numbers,i);
    numbers.push(i);
}



0 commentaires

4 Réponses :


0
votes

Vous remettez sur la matrice au lieu de la valeur.

function printNumber([...num], i) {
    setTimeout(() => console.log(...num), 500 * i);
}

let numbers = [50];

for (let i = 1; i <= 10; i++) {
    numbers.push(i);
    printNumber(numbers, i);
}


0 commentaires

0
votes

Je pense que vous chercherez peut-être quelque chose comme dans le ci-dessous. La matrice inclut toutes les valeurs chaque itération car la boucle fonctionne à l'achèvement avant que le settimeout code> commence à imprimer des choses.

Étant donné que les tableaux sont stockés sous forme de références, num code> est muté par numéros.push (i) code>. p>

Passer la fonction Un nouveau tableau la boucle résoudra ceci. p>

p>

function printNumber(num,i){

    setTimeout(()=>console.log(num),500*i);
}


let numbers = [50];

for(let i=1; i<=10; i++){
    // Create new array when you pass it here
    printNumber([...numbers],i);
    numbers.push(i);
}


0 commentaires

0
votes

C'est parce que JavaScript passe des tableaux par référence * , ce qui signifie que le rappel, qui fonctionne longtemps après la fin de la boucle est terminé, sera tout à jour, la valeur de la matrice.

Vous devez copier la matrice à chaque fois pour utiliser l'intermédiaire Etat. Vous pouvez appeler printnumber de cette façon: xxx

de sorte qu'il rendra une nouvelle copie de la matrice et des itérations ne se gâteront pas les unes avec les autres.

* Voir Commentaire de Brian Thompson pour plus de précision


2 commentaires

Votre solution est correcte mais votre titre de lien est faux. JavaScript est toujours passe-valeur, pas référence. En fait, l'une des meilleures réponses de la question que vous avez liées explique cela. La valeur détenue dans des variables pour des objets (y compris les tableaux) est une référence. Donc, il passe toujours la valeur , mais la valeur est une référence. C'est presque le même effet, sauf que cela signifie que la mutation accidentelle peut se produire sans jamais le transmettre à une fonction.


@Brianthompson correct! Édité ma réponse pour faire référence à votre commentaire (pas de jeu de mots)



0
votes

Settimeout est une minuterie. Il exécutera quoi que ce soit à l'intérieur avec un retard. Cela ne met pas en pause le reste du code. Au moment où console.log code> Exécutez votre tableau est complet. Donc, il imprimera le tableau rempli.

p>

let numbers = [50];

for(let i=1; i<=10; i++){
     
     setTimeout(()=>{  
       console.log(numbers, i)
       numbers.push(i); 
       
     },500*i);
}


0 commentaires