等到回调

时间:2015-11-09 16:00:12

标签: javascript callback

我有一个带有音频文件的数组,可以一个接一个地播放。 我正在使用一个javascript播放器,播放音频并在完成后提供回调。

for (i = 0; i < audioFiles.length; i++) {
    PlayAudio(audioFiles[i], function(){
        alert('complete file #' + i);
    });
}

但我现在的问题是,如何逐一完成这个问题。上面的代码片段将启动多个音频文件并将它们并行播放。什么是最好的解决方案,等到回调被触发?

3 个答案:

答案 0 :(得分:5)

有很多解决方案。等到回调开火似乎是一个很好的解决方案。

function playAudioFile(index) {
  PlaidAudio(audioFiles[index], function () {
    var next = index + 1;
    if (next < audioFiles.length) {
      playAudioFile(index+1);
    }
  });
}

function playAudioFiles() {
  playAudioFile(0);
}

旁注:

如果您正在寻找一种更通用的方式来连续运行任务,您应该查看承诺hereherehere(尽管最后一篇文章仅是对于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");
    }
);

https://github.com/caolan/async

答案 2 :(得分:-1)

您可以使用Promises和Generators的组合来实现您想要的效果。使用Promises和Generators的组合将让你等待每个文件在播放下一个文件之前完成播放,同时仍然保持线程打开以进行用户交互或任何你想要的。

This article有一些很好的入门背景。