如何在if-loop中只执行一次?

时间:2015-03-02 15:24:12

标签: javascript jquery html if-statement web

编辑(更具体):

我有以下情况。我正在用JavaScript构建一个实验性的合成器接口。我正在使用howler.js插件来处理音频。 这个想法是,如果满足某个条件,就会播放声音。我有一个数字存储变量,其值通过iPhone指南针的标题更改我使用compass.js。它有一个名为heading的变量。

$(function(){

    Compass.watch(function (heading) {
      $('.degrees').text(Math.floor(heading) + '°');
      $('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');

       if (heading >= 10 && heading <= 30) {
       sound.play("myFirstSound"); 
       } 
       else if (heading >= 31 && heading <= 60) {
       sound.play("mySecondSound");
       } else { etc etc...
       });
});

即使标题是常量,.play命令也不会执行一次,而是一遍又一遍地执行,导致音频引擎耗尽内存。如何只在if循环中执行一次命令?我无法访问罗盘功能之外的标题值。我总是得到 var标题不存在错误。

6 个答案:

答案 0 :(得分:2)

只需使用布尔变量。

var alreadyPlayed = false;

for(somecondition){
   if(alreadyPlayed) continue;

   sound.play("myFirstSound");
   alreadyPlayed = true;
}

你明白了。

答案 1 :(得分:1)

创建boolean flag并仅在false时播放声音。

var isPlayed = false;
var oldValue = myVariable;

if (myVariable >= 10 && myVariable <= 30 && !isPlayed) {
    sound.play("myFirstSound"); 
    isPlayed = false;
} 

然后在需要时初始化变量...对于你说的我猜你需要一个变量来比较循环内的值并将isPlayed标志设置为false

if (myVariable != oldValue)
    isPlayed = false;

答案 2 :(得分:1)

采用类似

的布尔变量
var checkOnce= false;
if (myVariable >= 10 && myVariable <= 30) {
checkOnce=true;
    sound.play("myFirstSound"); 
    } 
    else if (myVariable >= 31 && myVariable <= 60) {
checkOnce=true;
    sound.play("mySecondSound");
    } else { etc etc...

在循环中检查checkOnce的值。循环将运行直到checkOnce = false

答案 3 :(得分:1)

布尔值是个好主意。您还可以使用onend对象的sound属性,这样您就可以知道何时可以再次开始播放声音。像这样:

var playing = false;
sound.onend = function () { playing = false;  };

while (condition) {
   if (!playing & ...)
       ...
   ...
}

答案 4 :(得分:1)

看到您对该问题的编辑,为下一次触发添加延迟,指南针可能会发射太快。不熟悉compass.js,但正如我所看到的那样,它每度发射一次,这就是很多......如果你将手机倾斜180度,即180度触发。 像,

setTimeout(function() { your_func(); }, 50); 

延迟50ms

您还可以通过添加10的计数器将可用的触发器限制在360到36或更少,1度计数为1。所以它只在10度移动后触发。

$(function(){
var counter = 0;
Compass.watch(function (heading) {
   if(counter <=10){
     counter++;
    }
    else{ 
   counter = 0;
  $('.degrees').text(Math.floor(heading) + '°');
  $('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');

   if (heading >= 10 && heading <= 30) {
   sound.play("myFirstSound"); 
   } 
   else if (heading >= 31 && heading <= 60) {
   sound.play("mySecondSound");
   } else { etc etc...
   }       
   });
});

答案 5 :(得分:0)

只添加一小部分抽象,以跟踪当前正在播放的内容。

var nameOfSoundPlaying = null;

function play(soundName) {
   if (nameOfSoundPlaying == soundName) { 
      return; 
   } else {
     if (nameOfSoundPlaying != null) {
        // stop currently playing sound (if still playing)
        ...
     }  
     nameOfSoundPlaying = soundName;
     sound.play(soundName);
   }
}

然后它会简化您的代码:

$(function(){

    Compass.watch(function (heading) {
      $('.degrees').text(Math.floor(heading) + '°');
      $('#rotate').css('-webkit-transform', 'rotate(' + (-heading) + 'deg)');

       if (heading >= 10 && heading <= 30) {
           play("myFirstSound"); 
       } 
       else if (heading >= 31 && heading <= 60) {
           play("mySecondSound");
       } else { etc etc...
       });
});