2015-05-26 148 views
1

递归函数我有这样的代码: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的回报。我怎样才能使这个循环成功通过所有的音频阵列?

在此先感谢。

+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/