Javascript 对于下一次迭代之前的循环延迟

Javascript 对于下一次迭代之前的循环延迟,javascript,Javascript,我必须在循环中添加延迟,以便在前一个音频完成后播放下一个音频 因此,在进入下一个迭代之前,我需要延迟 代码片段 for (var i=0; i<=total_units; i++) { var audio; switch (dispatch_units[i]) { case 'ST39': audio = new Audio('sounds/alert1.mp3'); break; case 'AL

我必须在循环中添加延迟,以便在前一个音频完成后播放下一个音频 因此,在进入下一个迭代之前,我需要延迟

代码片段

 for (var i=0; i<=total_units; i++) { 
    var audio;
    switch (dispatch_units[i]) {
        case 'ST39':
        audio = new Audio('sounds/alert1.mp3');
            break;
        case 'ALS':
            audio = new Audio('sounds/monty_engine.mp3');
            break;
        case 'ST38':
            audio = new Audio('sounds/twotone.mp3');
            break;
    }
    audio.play();                               
 }

如果添加5秒延迟,我们将不胜感激。您不能以不会出现严重UI问题的方式延迟for循环的执行

相反,在前一个项目结束后5秒,使用一系列回调播放下一个项目:

var i = 0;
runOne();
function runOne() {
    var audio;
    switch (dispatch_units[i]) {
        case 'ST39':
            audio = new Audio('sounds/alert1.mp3');
            break;
        case 'ALS':
            audio = new Audio('sounds/monty_engine.mp3');
            break;
        case 'ST38':
            audio = new Audio('sounds/twotone.mp3');
            break;
    }
    // If it's impossible for `audio` not to be set here, you can simplify this
    if (audio) {
        audio.addEventListener("ended", runNext);
        audio.play();
    } else {
        setTimeout(runNext, 0);
    }

    function runNext() {
        audio.removeEventListener("ended", runNext);
        ++i;
        if (i <= total_units) {
            setTimeout(runOne, 5000);    // <=== 5000ms = 5 seconds
        }
    }
}

旁注:从0开始并通过是不寻常的,您不能以不会出现严重UI问题的方式延迟for循环的执行

相反,在前一个项目结束后5秒,使用一系列回调播放下一个项目:

var i = 0;
runOne();
function runOne() {
    var audio;
    switch (dispatch_units[i]) {
        case 'ST39':
            audio = new Audio('sounds/alert1.mp3');
            break;
        case 'ALS':
            audio = new Audio('sounds/monty_engine.mp3');
            break;
        case 'ST38':
            audio = new Audio('sounds/twotone.mp3');
            break;
    }
    // If it's impossible for `audio` not to be set here, you can simplify this
    if (audio) {
        audio.addEventListener("ended", runNext);
        audio.play();
    } else {
        setTimeout(runNext, 0);
    }

    function runNext() {
        audio.removeEventListener("ended", runNext);
        ++i;
        if (i <= total_units) {
            setTimeout(runOne, 5000);    // <=== 5000ms = 5 seconds
        }
    }
}
旁注:从0开始并通过来完成这项任务是不常见的

要停止间歇,请使用

代码示例

var i = 0;
var loop = setInterval(function() {
  var audio;
  switch (dispatch_units[i]) {
    case 'ST39':
      audio = new Audio('sounds/alert1.mp3');
      break;
    case 'ALS':
      audio = new Audio('sounds/monty_engine.mp3');
      break;
    case 'ST38':
      audio = new Audio('sounds/twotone.mp3');
      break;
  }
  audio.play();
  i++;
  if(i<=total_units) {
      clearInterval(loop);
  }
}, 5000);
你可以用它来做

要停止间歇,请使用

代码示例

var i = 0;
var loop = setInterval(function() {
  var audio;
  switch (dispatch_units[i]) {
    case 'ST39':
      audio = new Audio('sounds/alert1.mp3');
      break;
    case 'ALS':
      audio = new Audio('sounds/monty_engine.mp3');
      break;
    case 'ST38':
      audio = new Audio('sounds/twotone.mp3');
      break;
  }
  audio.play();
  i++;
  if(i<=total_units) {
      clearInterval(loop);
  }
}, 5000);

侦听onended事件=>object.addEventListenerended,myScript;使用SetTimeOutpunctoBeExecuted,1000;在延迟1秒后调用音频,必须用歌曲持续时间替换。ref:Listen for onended event=>object.addEventListenerended,myScript;使用SetTimeOutpunctoBeExecuted,1000;在延迟1秒后调用音频,必须用歌曲持续时间替换。参考:可以,但是如果音频剪辑的长度大于或小于5秒,它会变得很难看。@T.J.Crowder但是OP说如果增加5秒的延迟,任何帮助都将被感激。是的,也许他们真的是这么想的。更可能的是,在我看来,他们不希望在这种情况下音频重叠,但是……这些是救援系统的调度单元警报,你可以,但是如果音频剪辑长度大于或小于5秒,就会变得难看。@t.J.Crowder但OP说,如果增加5秒的延迟,任何帮助都将被感谢是的,也许他们真的是这么想的。更可能的是,在我看来,他们不希望在这种情况下音频重叠,但是…这些是救援系统的调度单元警报