【问题标题】:SetInterval function is playing audio twice instead of onceSetInterval 函数正在播放音频两次而不是一次
【发布时间】:2017-07-05 06:47:54
【问题描述】:

我遇到了一个奇怪的问题,我正在为 freecodecamp 构建一个西蒙说游戏,但每次我运行下面的函数时,它都会播放两次音频。即使我只调用一次函数,有什么想法吗?

change('#8B0000','#E8A5A5','1000','1000','#2');
  var redSound = new 
   Audio("https://s3.amazonaws.com/freecodecamp/simonSound1.mp3");  
   var blueSound = new 
 Audio("https://s3.amazonaws.com/freecodecamp/simonSound2.mp3");
 var greenSound = new Audio 
("https://s3.amazonaws.com/freecodecamp/simonSound3.mp3");
 var yellowSound = new Audio 
 ("https://s3.amazonaws.com/freecodecamp/simonSound4.mp3"); 


function change(color1, color2,c1,c2,button){
    console.log("Inside Start of function");
var timer = setInterval(function first_color() {
  $(button).css('background',color2);
 if(color2 == '#34d955'){
    greenSound.play()
    } else if(color2 == '#E8A5A5'){
    redSound.play()
    } else if(color2 =='#F3FEA5'){
        yellowSound.play();
    }else if(color2 == '#A5DEFE'){
        blueSound.play()
    }

   setTimeout(change_color, c2);
 }, c1);//  
 function change_color() {
    $(button).css('background',color1);
     clearInterval(timer);
   }

【问题讨论】:

    标签: function settimeout setinterval


    【解决方案1】:

    在调用超时之前你的计时器被触发两次。

    在您的区间内跟踪正在播放的声音,如果您已经调用了播放声音的方法,则返回。

    var playing = null;
    function change(color1, color2, c1, c2, button) {
        console.log("Inside Start of function");
        var timer = setInterval(function first_color() {
            if (playing == color2) return;
            playing = color2;
            $(button).css('background', color2);
            if (color2 == '#34d955') {
                    greenSound.play()
            } else if (color2 == '#E8A5A5') {
                redSound.play()
            } else if (color2 == '#F3FEA5') {
                yellowSound.play();
            } else if (color2 == '#A5DEFE') {
                blueSound.play()
            }
    
            setTimeout(change_color, c2);
        }, c1);//
        function change_color() {
            $(button).css('background', color1);
            clearInterval(timer);
        }
    

    【讨论】:

    • 你是对的,在 2 秒的窗口内,循环播放了两次,我能够减少到 500 毫秒,它工作了谢谢
    • 想了很多。您可以对此答案进行投票并将其标记为正确,以便遇到此问题的其他人遇到同样的问题知道该问题以及如何解决它。
    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多