JS:使用setInterval有条件地播放声音

时间:2018-07-17 13:00:36

标签: javascript

我有一个数组,里面有16个错误的布尔值。

var arr = [];
for(let i=0;i<15;i++){
    arr.push(false);
}

我正在将[0] [4] [8] [12]的布尔值设置为true。

arr[0]=true;
arr[4]=true;
arr[8]=true;
arr[12]=true;

我还有一个playSound函数,可以使用WebAudio API创建和播放声音。

function playSound(){
var oscillator = audio.createOscillator();

oscillator.type = 'sine';
oscillator.frequency.value = 440;
oscillator.connect(audio.destination);
oscillator.start(audio.currentTime);
oscillator.stop(audio.currentTime+0.5);
}

我希望我的“播放”功能每500毫秒检查一次数组给定索引中是否为真,然后使用playSound函数播放声音。

var index = 0;

function play(){
    setInterval(function() {
    if(arr[index]===true){
        playSound;
        index++ % arr.length; ;
    }   
},500)}

但是它似乎不起作用。怎么了?

2 个答案:

答案 0 :(得分:0)

var index = 0;

function play(){
    setInterval(function() {
    if(arr[index]===true){
        playSound();
        index++ ;
    }   
},500)}

我认为您忘记了括号()来调用该方法。

答案 1 :(得分:0)

许多人提到在致电()时忘记了括号playSound ...

但是,您也只在index时增加arr[index]===true变量,这可能不是您想要的。考虑您的初始设置:

  • arr看起来像这样:[true, false, false, false, true, ...]
  • index设置为0

调用函数play()时,间隔开始计时,因此每500毫秒运行一次。第一次运行时,它会检查arr[index]===true(同样,index0开始)。 arr[0]true,因此条件通过,因此调用playSound()并将index增至1。

在下一个周期,将再次检查arr[index]===true,但是这次index1,而arr[1]false,因此条件不成立AND index不递增。因此,从现在开始将经过500毫秒,将调用相同的条件arr[index]===true,但是index将永远不会递增(因为index++中的if-condition行)。

所以您的问题似乎是:

  1. playSound需要带括号-> playSound()
  2. index++必须放在if-statement函数内部setInterval之后,如下所示:

play函数更改为如下形式:

function play() {
    setInterval(function() {
        if (arr[index]===true) {
            playSound();
        }
        index++ % arr.length;
    }, 500)
}