2017-08-20 1 views
2

J'ai une fonction appelée primeFactors où j'essaie de trouver tous les nombres qui sont les diviseurs d'un certain numéro n, mais en même temps, ils doivent aussi être des nombres premiers. Juste un algorithme de base dans un sens. En faisant cela, j'ai aussi pensé qu'il serait amusant (juste pour le plaisir) de mettre du son audio qui joue chaque fois que l'instruction while passe à travers le bloc. Cependant, le son ne joue qu'une seule fois, même si parfois le résultat est un tableau de trois facteurs (par exemple [2, 7, 11]). Dans ce cas, je voudrais que le son soit joué trois fois, avant de pousser chaque élément dans le tableau. Voici mon code:Jouer le son audio à chaque fois qu'un élément est poussé dans le tableau

function primeFact(n) { 
    let factors = []; 
    let divisor = 2; 
    let clap = new Audio('clap.mp3'); 

    while (n > 2) { 
     if (n % divisor == 0) { 
      clap.currentTime = 0; 
      clap.play(); 
      factors.push(divisor); 
      n = n/divisor; 
     } else { 
      divisor++; 
     } 
    } 
    return factors; 
} 
+0

Voulez-vous attendre que la lecture soit terminée avant de la jouer une deuxième fois? – SLaks

+0

@SLaks Oui, ce serait bien. – IsaaK08

Répondre

3

Vous pouvez utiliser une file d'attente. Le son n'en joue qu'un parce que dans cette boucle c'est presque instantané. Cela fonctionne:

<script> 
var sounds = new Array, 
    clap = new Audio('clap.mp3'); // no need to assign it every time 
function primeFact(n) { 
    let factors = []; 
    let divisor = 2; 

    while (n > 2) { 
     if (n % divisor == 0) { 
      clap.currentTime = 0; 
      sounds.push(clap); // add sound to queue 
      factors.push(divisor); 
      n = n/divisor; 
     } else { 
      divisor++; 
     } 
    } 
    playQueuedSounds(); // play all sounds added 
    return factors; 
} 
function playQueuedSounds() { 
    if (sounds.length === 0) return; 
    var sound = sounds.pop(); // get last sound and remove it 
    sound.play(); 
    sound.onended = function() { // go look at the queue again once current sound is finished 
     playQueuedSounds(); 
    }; 
} 
primeFact(25); // two clap noises :) 
</script>