加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在不挂起浏览器的情况下执行“实时”javascript

发布时间:2020-12-15 02:22:15 所属栏目:Java 来源:网络整理
导读:我正在尝试用 Javascript编写一个简单的音乐序列器. 声音将播放SoundManager2 我很快意识到setTimeout和setInterval对于这种时序没用.他们的准确性根本不够好. 所以我正在尝试的是这样的: 创建一个声音事件队列(一个二维数组[注意,时间]) 在while循环中处理
我正在尝试用 Javascript编写一个简单的音乐序列器.

声音将播放SoundManager2

我很快意识到setTimeout和setInterval对于这种时序没用.他们的准确性根本不够好.

所以我正在尝试的是这样的:

创建一个声音事件队列(一个二维数组[注意,时间])

在while循环中处理队列

在伪代码中,它可能如下所示:

// The queue of time/note values (millisecs)
var q = [[0,C],[250,D],[500,E]]

var begin = (new Date).getTime()

while(q.length > 0 ){
    var now = (new Date).getTime()
    var eventTime = q[0][0] + begin

    if( now >= eventTime){

        playNote(q[0][1]) // Play the note  
        q.shift()       // Now that the note has been played,discard it.
    }
}

通过调试我发现这个方法看起来足够精确(playNote调用是在它应该的确切时间进行的).

然而,当’序列’正在播放时,所有其他Javascript(包括实际发出声音的位)被暂停,这几乎不是一个惊喜.

这意味着我已经沉默了很长时间来运行序列,然后执行所有对playNote的调用.

我已经尝试在它自己的函数中隔离while循环,然后通过setTimeout调用它,希望这会创建一个后台线程执行它自己的东西(即播放序列)而不停止所有其他JS执行.这不起作用

我也尝试使用setTimeout调用playNote函数,希望尽管UI确实至少冻结了序列正在播放,但这也不起作用.

我也尝试了一种组合,但正如你可能已经猜到的那样,这也不起作用.

所以我的问题是:

如何在精确计时的情况下处理事件队列,而不是在运行期间关闭所有其他代码执行

解决方法

我不知道是否有适合旧版浏览器的解决方案,但 web workers是用于在JavaScript中进行并行执行.

最新版本的Chrome和Firefox支持它们,我不了解其他浏览器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读