2015-05-26 144 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/