2015-05-26 8 views
1

У меня есть этот код:AngularJS рекурсивная функция на Promises

$scope.play = function (audio) { 
    var deferred = $q.defer(); 
    api.play(audio).then(function() { 
     deferred.resolve(); 
    }, function (err) { 
     deferred.reject(); 
     console.log(err); 
    }); 
    return deferred.promise; 
}; 

У меня есть массив audio, что я использую в мой контроллер и перейти к $scope.play. Однако, используя ниже:

var playIndex = 0; 
$scope.play(audios[playIndex]).then(function() { 
    playIndex++; 
    $scope.play(audios[playIndex]); 
}); 

Это работает в течение первых двух аудиофайлов я имею в массиве, конечно, так как я не проверять возвращение второго .play. Как я могу сделать этот цикл через весь массив аудио?

Заранее спасибо.

+0

Оберточные существующие обещания в новых отсрочек является анти-шаблоном. Ваша функция должна быть '$ scope.play = function (audio) {return api.play (audio); } '. Вот и все. –

ответ

1

Вы можете создать функцию poll, которая будет называть себя рекурсивно, когда будет достигнуто разрешение последнего аудиообъявления. Функция пула вызовет $scope.play, который будет увеличивать playIndex по его успеху &, а затем снова вызовет функцию опроса, которая будет искать следующий звук для воспроизведения. Вы должны убедиться, добавив некоторые условия, прежде чем звонить poll(playIndex), чтобы получить его бесконечно.

Код

(function poll(playIndex) { 
    $scope.play(audios[playIndex]).then(function() { 
     playIndex++; 
     poll(playIndex);//here it should be call on some condition 
    }); 
})(playIndex); 
+0

Спасибо, пожалуйста, уточните, как я не уверен, как это использовать. - Обратите внимание, что функция .play принимает 'audios [index]' не только индекс, как вы описали. – user1027620

+0

@ user1027620 взгляните на мое обновление –

2

Вы можете назвать функцию переходила в then и вызывать его из себя рекурсивно:

var playIndex = 0; 

$scope.play(audios[playIndex]).then(function next() { 
    if (++playIndex < audios.length) { 
     $scope.play(audios[playIndex]).then(next); 
    } 
}); 

Демо:http://jsfiddle.net/3jx3eh8t/

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