HTML5 Audio не работает с методом setTimeout

1

Я новичок в JavaScript и jQuery, то, что я делаю, на самом деле вызывает функцию с массивом некоторых цветов, изначально это ['blue', 'green'] И я запускаю for-loop на этом массиве, чтобы играть звук, характерный для каждого номера.

Но проблема в том, что она просто воспроизводит звук с последним параметром. Почему так? Я хочу играть как (или сколько я настраиваю) звуки, которые будут воспроизводиться после определенного интервала (например, здесь у меня 1000 мс). Заранее спасибо.

Вот мой код:

function singPattern(compPattern) {
    var audio;
    for(let i=0; i<compPattern.length; i++) {

        audio = new Audio("../../music-files/" + compPattern[i] + ".mp3");
        window.setTimeout(function () {
            audio.play();
        }, 2000);
    }
}
Теги:
audio

1 ответ

0
function singPattern(compPattern) {
    var audio; // There is only one audio
    for(let i=0; i<compPattern.length; i++) {

        //everytime in this loop audio is assigned to the "Audio" 
        //  the old one is off to the pasture. (dead)(GC) 
        audio = new Audio("../../music-files/" + compPattern[i] + ".mp3");
        window.setTimeout(function () {
            audio.play();
        }, 2000);
    }
}

Как и во всех javascript, есть несколько способов справиться с этим.

вы можете передать объект в таймаут, как это. и тайм-аут будет закрывать объект.

function singPattern(compPattern) {
    for(let i=0; i<compPattern.length; i++) {
        // I will just print the word but you can pass the object in. 
        var audio = compPattern[i] + ".mp3";
        window.setTimeout(function (_audio) {
            console.log(_audio)
        }, 2000, audio);
    }
}

Если вам нужен доступ к объекту Audio вне setTimeout, чтобы отменить/воспроизвести его, вы можете настроить такой словарь:

function singPattern(compPattern) {
    var audio ={};
    for(let i=0; i<compPattern.length; i++) {       
        audio[compPattern[i]] = compPattern[i] + ".mp3";        
    }
    setTimeout(function(){
       for( var a in audio ){ console.log( "play ", a , audio[a] ); } 
    },2000);
    // audio['green'].pause() ?     
}

редактировать

Heres рабочий образец с внешними mp3s

function singPattern(compPattern) { 
  for (let i = 0; i < compPattern.length; i++) {  
    var audio = compPattern[i];         
    setTimeout(function (_audio) { 
      var sound = new Audio(_audio); 
      console.log("Playing " + _audio);
      sound.play(); 
    }, 2000, audio); 
  } 
}

var soundUrls = ["http://soundbible.com/mp3/Stream Noise-SoundBible.com-866411702.mp3", "http://soundbible.com/mp3/Strange_Days-Mike_Koenig-176042049.mp3"];

singPattern(soundUrls);
  • 0
    Я попробовал ваш второй фрагмент кода, но он все еще не работает :( function singPattern(compPattern) { for (let i = 0; i < compPattern.length; i++) { // I will just print the word but you can pass the object in. var audio = "../../music-files/" + compPattern[i] + ".mp3"; window.setTimeout(function (_audio) { var sound = new Audio(_audio); sound.play(); }, 2000, audio); } }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню