2016-11-16 17 views
3

我試圖做一個小腳本,將我的文字轉換成莫爾斯,我已經能夠做到這一點很容易,但是我試圖播放聲音,但他們都堆疊起來。我一直在嘗試使用addEventListener,但它只與第二個聲音一起工作,而所有其他聲音都是「堆疊」的。這有點難以解釋,但是如何使一個接一個播放的聲音成爲一種「隊列」?如何在Javascript中全部堆疊時觸發一個聲音?

在這個函數中,我得到莫爾斯的代碼(例如:**** * * - ** * - ** ---),它正在讀取莫爾斯發出的聲音,但像我說,這是全部「堆積」。

function readMorse(){ 
        traductionWord(); 
        var int_position_morse; 
        int_position_morse = 0; 
        while (strCodeMorse.charAt(int_position_morse) != ""){ 
         if (strCodeMorse.charAt(int_position_morse) == "*"){ 
          playShortSnd(); 
          int_position_morse++;  
         } 
         if (strCodeMorse.charAt(int_position_morse) == "-"){ 
          playLongSnd(); 
          int_position_morse++;  
         } 
         if (strCodeMorse.charAt(int_position_morse) == " "){ 
          int_position_morse++; 
         } 
        }` 

對不起,如果有點不清楚。

感謝

+0

播放聲音是一種異步操作,您必須等待聲音完成。 –

+0

您可以嘗試在每個聲音之後添加暫停。看到這篇文章:http://stackoverflow.com/questions/14226803/javascript-wait-5-seconds-before-executing-next-line – Jacey

+0

我試圖添加一個暫停,但每個「符號」後所需的暫停是不同的。換句話說,他們不會處於良好的秩序,有些將被堆積。 –

回答

1

您莫爾斯玩家一個簡單的解決方案是要排隊的聲音,爲了發揮他們,不時停頓下來。

一個非常簡單的實現可以使用setInterval

pendingSounds = [] 

function queueSound(sound) { 
    pendingSounds.push(sound) 
} 

function playPendingSound() { 
    playSound(pendingSounds.shift()) 
} 

setInterval(playPendingSound, 200) 

如果你想有不同長度的停頓,你可以每次都使用setTimeout

+0

我試過了你的方式,但它似乎沒有工作,聲音仍然堆疊。延遲似乎只有當我輸入很多字符串時纔有效,然後有一個延遲,但只有2個字(不是兩個符號)。 –

+0

你有沒有試過玩毫秒數? – slezica

+0

是的,通過玩延遲它的工作,但似乎在一定數量的符號後,他們開始堆疊並失去同步。 –