在不挂起浏览器的情况下执行“实时”javascript
我正在尝试用
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支持它们,我不了解其他浏览器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |