javascript - How to run angularjs ajax request in loop but with delay? -


i need run 20-200 ajax requests in loop not hurt google.maps.geocoder want set delay 10 sec between each call. ajax request asynchronous therefore call next ajax request on response succeeded of previous one. if response quick, delay should take place.

here code wrote far:

 ...  $scope.addresslist = ....;  $scope.taskcount = $scope.addresslist.length;   geotaskloopasync();   function geotaskloopasync(){      // on success douncount taskcount      var geo = new google.maps.geocoder();     geocoder.geocode( {     'address': address         }, function(results, status) {             $scope.$apply( function () {                 // response                 if($scope.taskcurr <= $scope.taskcount){                  $scope.taskcurr++;                  return geotaskloopasync();                }                  return;             });         }); 

so next?

can add like:

 stop = $timeout(function() {           if($scope.taskcurr <= $scope.taskcount){                            geotaskloopasync();         } else {             $timeout.cancel(stop);         }                     }, 10000); 

or have other way?

thank you,

this seems great use case promises , $q service.

here's rough sketch of using promises might like. declare delay service handle 10 second delay , maps service handle geocoding. both services return promises, , controller can combine promises using $q.all() ensure there @ least 10 second delay between google api calls.

angular.module( /* load module */ ).service('delay', ['$q', '$timeout', function ($q, $timeout) {     return {         start: function () {             var deferred = $q.defer();             $timeout(deferred.resolve, 10000);             return deferred.promise;         }     }; }]);  angular.module( /* load module */ ).service('maps', ['$q', function ($q) {     var geocoder = new google.maps.geocoder();     return {         geocode: function (address) {             var deferred = $q.defer();              geocoder.geocode({                 'address': address             }, function (results, status) {                 deferred.resolve(results);                 // should reject if ajax errors.             });              return deferred.promise;         }     }; }]);   angular.module( /* load module */ ).controller('geocodingcontroller', ['delay', 'maps', '$q', function (delay, maps, $q) {     var addresses = [/* array of addresses geocode */],         addressindex = 0,         geocodeaddresses = function geocodeaddresses() {             // use $q.all callback execute when geocoding done , 10 seconds have passed.             $q.all([delay.start(), maps.geocode(addresses[addressindex])]).then(function (results) {                 addressindex += 1;                 var geocodeddata = results[1]; // geocode result in second index.                  // results.                  if (addressindex < addresses.length) {                     geocodeaddresses();                 }             });         };      // kick off ajax requests.     geocodeaddresses(); }]); 

Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -