Javascript 每次将元素推入阵列时播放音频声音

Javascript 每次将元素推入阵列时播放音频声音,javascript,algorithm,primes,Javascript,Algorithm,Primes,我有一个名为primeFactors的函数,我试图找到某个n数的除数,但同时,它们也必须是素数。从某种意义上说,这只是一个基本的算法 在这样做的同时,我还认为在语句在块中循环时播放音频声音会很有趣(只是为了好玩)。但是,声音只播放一次,即使有时结果是由3个因素组成的数组(例如[2,7,11])。在本例中,我希望在将每个元素推入阵列之前,声音播放三次。这是我的密码: function primeFact(n) { let factors = []; let divisor = 2;

我有一个名为
primeFactors
的函数,我试图找到某个
n
数的除数,但同时,它们也必须是素数。从某种意义上说,这只是一个基本的算法

在这样做的同时,我还认为在
语句在块中循环时播放音频声音会很有趣(只是为了好玩)。但是,声音只播放一次,即使有时结果是由3个因素组成的数组(例如
[2,7,11]
)。在本例中,我希望在将每个元素推入阵列之前,声音播放三次。这是我的密码:

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

您可以使用队列。声音只播放一次,因为在这个循环中几乎是瞬间的。这项工作:

<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>

var sounds=新数组,
clap=新音频('clap.mp3');//不需要每次都分配它
函数primeFact(n){
让因子=[];
设除数=2;
而(n>2){
如果(n%除数==0){
clap.currentTime=0;
声音。按(拍);//将声音添加到队列
因子push(除数);
n=n/除数;
}否则{
除数++;
}
}
playQueuedSounds();//播放添加的所有声音
回报因素;
}
函数playQueuedSounds(){
如果(sounds.length==0)返回;
var sound=sounds.pop();//获取最后一个声音并将其删除
声音。播放();
sound.onended=function(){//当前声音结束后,再次查看队列
播放队列声音();
};
}
基本事实(25);//两个拍手声:)

是否要等待它完成播放,然后再播放第二次?@SLaks是的,那很好。