2016-11-16 21 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

是的,通过玩延迟它的工作,但似乎在一定数量的符号后,他们开始堆叠并失去同步。 –