如何重复ajax调用,直到服务器返回特定值?

时间:2015-07-16 15:02:18

标签: ajax angularjs

我需要填充进度条,我有一项服务给我当前进度。 我的想法是这样的:

$http.get('service').success(function(response, status, headers, config){
         $scope.progress = response.progress;
         $scope.progressL = response.progress+"%";
         if(response.progress < 100){
             //repeat
         }

2 个答案:

答案 0 :(得分:1)

只需将api调用放在一个函数中,让处理程序调用它:

function checkProgress(){
    $http.get('service').success(function(response, status, headers, config){
       $scope.progress = response.progress+"%";
       if(response.progress < 100){
           checkProgress();
       }
   }
}

尽管如此,你可能想以某种方式限制它。您可能还希望添加超时,以便在检查之间等待一段时间,这与$timeout(checkProgress, 5000)一样。

为清晰起见编辑:这不会溢出你的筹码的原因是Angular的承诺$q$http.get('service')返回的承诺是实现者,将异步触发。

所以在以下情况中:

$http.get('service').success(function(){ console.log('callback'); });
console.log('Returning');
return;

控制台会说&#34;返回&#34;之前&#34;回调&#34;每次。

如果保证分辨率是异步的,那你很好。以下是数千次解析异步的演示:http://jsfiddle.net/23Ldaj42/

如果不是这种情况(例如,如果$http回调不能保证被称为异步),而是你想通过强制它如下所示来保护自己:

function checkProgress(){
    $http.get('service').success(function(response, status, headers, config){
       $scope.progress = response.progress+"%";
       if(response.progress < 100){
           $timeout(checkProgress); // This will perform async
       }
   }
}

答案 1 :(得分:1)

你可以递归地调用它:

var callback = function(response, status, headers, config){ $scope.progress = response.progress; $scope.progressL = response.progress+"%"; if(response.progress < 100){ $http.get('service').success(callback); } }; $http.get('service').success(callback);