AngularJS对Promises的递归函数

时间:2015-05-26 05:21:52

标签: javascript angularjs

我有这段代码:

 $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的返回。如何成功完成所有音频阵列的循环?

提前致谢。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:1)

您可以创建一个poll函数,该函数将在最后一个音频承诺得到解决后递归调用自身。池功能将调用$scope.play,这将增加playIndex的成功与否。然后再次调用poll函数,该函数将查找要播放的下一个音频。你需要确保在调用poll(playIndex)之前添加一些条件才能无限调用它。

<强>代码

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