AngularJS等待foreach内部的所有异步调用

Dan*_*iel 9 javascript asynchronous trello angularjs

我使用angular.forEach循环遍历数组并调用非角度ajax库(Trello client.js).客户端确实有"成功"和"错误"回调,但不会返回角度延迟.所有ajax调用完成后,我想执行一个函数.

我有以下代码:

$scope.addCards = function(listId)
            {
                var cardTitles = $scope.quickEntryCards[listId].split('\n');
                angular.forEach(cardTitles, function(cardTitle,key)
                {
                    Trello.post('/cards', {
                        name:cardTitle,
                        idList:listId
                    },function(){ }, function(){ });
                });
                //TODO: wait for above to complete...
                $scope.init($routeParams.boardId);  
                $scope.quickEntryCards[listId] = '';    
            };
Run Code Online (Sandbox Code Playgroud)

我可以在// TODO和回调函数中做什么,以便最后2行只在所有帖子成功或失败后运行?

km6*_*zla 24

使用angular的$ q服务的伪代码.

requests = [];

forEach cardTitle
   var deferred = $q.defer();
   requests.push(deferred);
   Trello.post('/path', {}, deferred.resolve, deferred.reject);

$q.all(requests).then(function(){
    // TODO
});
Run Code Online (Sandbox Code Playgroud)

  • 我相信你需要使用`requests.push(deferred.promise);`来实现它.否则,将立即调用`$ q.all(requests).then(...)`. (5认同)

Alf*_*feu 10

对于那些寻找问题标题"AngularJS等待foreach结束内所有异步调用"的答案的人来说,这是实现它的通用方法,也使用angular的$ q服务:

$scope.myArray = [1, 2, 3, 4, 5, 4, 3, 2, 1];
var loopPromises = [];
angular.forEach($scope.myArray, function (myItem) {
    var deferred = $q.defer();
    loopPromises.push(deferred.promise);
    //sample of a long-running operation inside loop...
    setTimeout(function () {
        deferred.resolve();
        console.log('long-running operation inside forEach loop done');
    }, 2000);

});
$q.all(loopPromises).then(function () {
    console.log('forEach loop completed. Do Something after it...');
});
Run Code Online (Sandbox Code Playgroud)

这是一个工作样本.