我有一个带有音频文件的数组,可以一个接一个地播放。 我正在使用一个javascript播放器,播放音频并在完成后提供回调。
for (i = 0; i < audioFiles.length; i++) {
PlayAudio(audioFiles[i], function(){
alert('complete file #' + i);
});
}
但我现在的问题是,如何逐一完成这个问题。上面的代码片段将启动多个音频文件并将它们并行播放。什么是最好的解决方案,等到回调被触发?
答案 0 :(得分:5)
有很多解决方案。等到回调开火似乎是一个很好的解决方案。
function playAudioFile(index) {
PlaidAudio(audioFiles[index], function () {
var next = index + 1;
if (next < audioFiles.length) {
playAudioFile(index+1);
}
});
}
function playAudioFiles() {
playAudioFile(0);
}
旁注:
如果您正在寻找一种更通用的方式来连续运行任务,您应该查看承诺here,here或here(尽管最后一篇文章仅是对于AngularJS)。
答案 1 :(得分:0)
Yoy可能会使用异步库。这样我用异步解决了每个问题。在这种情况下,您可以使用&#34;每个&#34;一句话:
async.each(
// List of item
audioFiles,
// Function to apply to each item
function(index, callback){
PlayAudio(audioFiles[index], function(){
callback()
});
},
// Function callback
function(err,results){
alert("Process finished");
}
);
如果你想避免并行性,你可以使用&#34; eachSeries&#34;而不是&#34;每个&#34;
async.eachSeries(
// List of item
audioFiles,
// Function to apply to each item
function(index, callback){
PlayAudio(audioFiles[index], function(){
callback()
});
},
// Function callback
function(err,results){
alert("Process finished");
}
);
答案 2 :(得分:-1)
您可以使用Promises和Generators的组合来实现您想要的效果。使用Promises和Generators的组合将让你等待每个文件在播放下一个文件之前完成播放,同时仍然保持线程打开以进行用户交互或任何你想要的。
This article有一些很好的入门背景。