addEventListener是否在while循环中工作?

时间:2018-01-08 12:39:33

标签: javascript audio while-loop javascript-events addeventlistener

我试图循环通过一些元素来改变单个音频元素的音频源,播放它,一旦结束,更改新的src并播放它直到循环遍历所有元素:

var contentAudio = new Audio();;

function audioLoop(index, audioModel) {

    while (index < audioModel.length) {
        var audio = contentAudio;
        audio.src = audioModel[index].src;
        audio.play()
        audio.addEventListener('ended', 
            function () {
                index++;
            });
    }
    console.log('done');

}

似乎添加事件侦听器不起作用。音频没有播放,我陷入无休止的循环。音频结束事件永远不会被触发。我做错了吗?还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

while循环是同步的,因此它不会等待您的ended事件。以下是我建议的内容:

var contentAudio = new Audio();

function audioLoop(index, audioModel) {

    (function process(done) {
      if (index >= audioModel.length) {
        done(); return;
      }
      var audio = contentAudio;
      audio.src = audioModel[index].src;
      audio.play()
      audio.addEventListener('ended', function () {
        index++;
        process(done);
      });
    })(function () {
      console.log('done');
    });

}

audioModel也是一个数组。如果是这样,我认为您应该使用audioModel[index].src而不是audioModel.src