2017-06-08 265 views
0

我有四個音頻。比方說s1,s2,s3和s4。我也有一個隨機整數的變量,例如myVar = [2,1,3,4]。它可以比四個更長或更短,但其中的整數總是在1到4之間。循環播放音樂

我想做一個循環,看看myVar並按照相應的順序播放我的聲音(在這種情況下:s2,s1,s3,s4)。一個接一個的聲音,這是非常重要的。不是一次全部。

我所有的解決方案都是一次播放聲音。我知道有幾個類似的問題,但我在JavaScript中很糟糕,以至於我無法使用答案。任何人都知道如何去做?

當前的一個解決方案(不工作):

function recTime (i) { 

    if (i === myVar.length) return; 

    if (myVar[i] === 1) { 
    setTimeout(function() { 
     s1.play(); 
     return recTime(++i); 
    },350);} 
    else if (myVar[i] === 2) { 
    setTimeout(function() { 
     s2.play(); 
     return recTime(++i); 
    },350); 
    } 
    else if (myVar[i] === 3) { 
    setTimeout(function() { 
     s3.play(); 
     return recTime(++i); 
    },350); 
    } 
    else if (myVar[i] === 4) { 
    setTimeout(function() { 
     s4.play(); 
     return recTime(i++); 
    },350); 
    } 
    } 

I call it in this cycle: 

    for (var i = 0; i < stimuli.length+1; ++i){ 
    recTime(i); 
    } 
+0

是的,我會把它放在問題的下面。 –

回答

0

也可能有不的突變的解決方案'order'數組,例如使用Symbol.iterator每個要求ended事件:

var a1 = new Audio('http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg'); a1.id = "1"; // id helps to see console.log is fine 
 
var a2 = new Audio('http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg'); a2.id = "2"; 
 
var a3 = new Audio('http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg'); a3.id = "3"; 
 
var a4 = new Audio('http://developer.mozilla.org/@api/deki/files/2926/=AudioTest_(1).ogg'); a4.id = "4"; 
 

 
var order = [2, 1, 4, 3, 2, 1]; 
 

 
rotateAudio(order); // main function; pass order array here 
 

 
function rotateAudio(order) { 
 
    var orderMap = {1: a1, 2: a2, 3: a3, 4: a4}; 
 
    var iterator = order[Symbol.iterator](); 
 
    var value, done; 
 
    
 
    function rotate({value, done}) { // get next iteration 
 
    function next(e) { 
 
     e.target.removeEventListener('ended', next); // helps for garbage removal I guess 
 
     rotate(iterator.next()) 
 
    }; 
 
    if (done) { console.log('done!'); return }; 
 
    var current = orderMap[value]; 
 
    console.log('current: ', current); 
 
    current.play(); 
 
    current.addEventListener('ended', next) // listen to 'ended' on audio, start next one 
 
    } 
 
    
 
    rotate(iterator.next()); // first call 
 
}

+0

非常感謝:-) –

+0

我怎樣才能重新設置它以重新調整一個新的訂單? –

+0

@RadekJohn你可以把這個邏輯封裝成一個函數,在那裏你傳遞'order'數組作爲參數。看看我編輯過的代碼:調用'rotateAudio(order)'傳遞一個包含數字的數組。當你需要一個不同的訂單 - 只需要用不同的數組來調用它。 – wostex

2

使用onended事件播放下一首歌曲,像這樣:

var musics = ['s1', 's2', 's3', 's4']; 
var order = [2,1,3,4]; 
var player; //get your audio tag here 
player.autoplay = true; 

function playNext() { 
    var current = order.shift(); 
    player.src = current; 
} 

player.addEventListener('ended', playNext); 
playNext(); 
+0

謝謝,我會嘗試。 –