2015-11-09 6 views
5

У меня есть массив с аудио-файлами, чтобы играть все по одному. Я использую javascript-плеер, который будет воспроизводить звук и обеспечивает обратный вызов по завершении.Подождите, пока обратный вызов

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

Но моя проблема сейчас, как это сделать по одному. Вышеприведенный фрагмент начнет несколько аудио-файлов и будет воспроизводить их параллельно. Какое оптимальное решение - подождать, пока не будет активирован обратный вызов?

+0

HTTP: //blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

«Не создавать функции в цикле» - одна из ошибок, возникающих при вводе кода через http: // jshint. ком /. – Tomalak

+0

Вы не можете «ждать» в JS, если вы имеете в виду «выполнение блока». Единственное, что вы можете сделать, это поместить код для следующих действий (здесь: загрузить следующий файл) в самом обратном вызове. Вместо цикла используйте рекурсивный подход. – Bergi

ответ

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) ,

+0

Я бы добавил инструкцию 'else' для регистрации (или выполнения другой функции) после завершения всего плейлиста. – pistou

-1

Вы можете использовать комбинацию обещаний и генераторов, чтобы достичь желаемого. Использование комбинации Promises и Generators позволит вам дождаться завершения каждого файла перед воспроизведением следующего, оставив поток открытым для взаимодействия с пользователем или тем, что вы желаете.

This article имеет несколько отличных условий для использования.

0

Yoy может использовать асинхронную библиотеку. Таким образом, я решаю каждую проблему с асинхронностью. В этом случае вы можете использовать "каждый" предложение:

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"); 
    } 
); 

И если вы хотите избежать параллелизма, вы можете использовать "eachSeries" вместо "каждый"

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

Смежные вопросы