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
Post a Comment