Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺上的AngularJS递归函数_Javascript_Angularjs - Fatal编程技术网

Javascript 承诺上的AngularJS递归函数

Javascript 承诺上的AngularJS递归函数,javascript,angularjs,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 deferr

我有以下代码:

 $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;
 };
我在控制器中使用了一组
音频
,并将其传递给
$scope.play
。但是,使用以下方法:

var playIndex = 0;
$scope.play(audios[playIndex]).then(function () {
    playIndex++;
    $scope.play(audios[playIndex]);
});
当然,这适用于阵列中的前两个音频,因为我没有检查第二个
.play
的返回。我如何才能成功地在所有Audio阵列中实现此循环


提前感谢。

您可以创建一个
poll
函数,当最后一个音频承诺得到解决时,该函数将递归调用自身。Pool函数将调用
$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);

您可以命名传递到
中的函数,然后
并从自身递归调用它:

var playIndex = 0;

$scope.play(audios[playIndex]).then(function next() {
    if (++playIndex < audios.length) {
        $scope.play(audios[playIndex]).then(next);
    }
});
var playIndex=0;
$scope.play(audios[playIndex])。然后(函数next(){
if(++播放索引<音频长度){
$scope.play(audios[playIndex]),然后(next);
}
});

演示:

谢谢,您能详细说明一下吗?因为我不知道如何准确地使用它。-请注意,.play函数采用的不仅仅是您描述的索引。
audios[index]
。将现有承诺包装在新的延期中是一种反模式。您的函数应该是
$scope.play=function(audio){return api.play(audio);}
。就这样,真的。