Javascript 如何在循环中延迟运行angularjs ajax请求?

Javascript 如何在循环中延迟运行angularjs ajax请求?,javascript,ajax,angularjs,geocoding,Javascript,Ajax,Angularjs,Geocoding,我需要在循环中运行20-200个ajax请求,但为了不伤害google.maps.Geocoder,我想在每次调用之间设置10秒的延迟。然而,ajax请求是异步的,因此我在前一个请求的响应成功时调用nextajax请求。如果我得到的响应太快,就会发生延迟 以下是我迄今为止编写的代码: ... $scope.addressList = ....; $scope.taskCount = $scope.addressList.length; geoTaskLoopAsync(); fun

我需要在循环中运行20-200个ajax请求,但为了不伤害google.maps.Geocoder,我想在每次调用之间设置10秒的延迟。然而,
ajax
请求是异步的,因此我在前一个请求的响应成功时调用next
ajax
请求。如果我得到的响应太快,就会发生延迟

以下是我迄今为止编写的代码:

 ...
 $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 () {
                // do something with response

               if($scope.taskCurr <= $scope.taskCount){
                 $scope.taskCurr++;
                 return geoTaskLoopAsync();
               }

                return;
            });
        });
。。。
$scope.addressList=。。。。;
$scope.taskCount=$scope.addressList.length;
geoTaskLoopAsync();
函数geoTaskLoopAsync(){
//关于成功douncount taskCount
var geo=new google.maps.Geocoder();
地理编码({
“地址”:地址
},功能(结果、状态){
$scope.$apply(函数(){
//做些有反应的事情

if($scope.taskCurr这似乎是promises和
$q
服务的一个很好的用例

下面是使用承诺的大致情况。我声明了一个延迟服务来处理10秒的延迟,一个映射服务来处理地理编码。这两个服务都返回承诺,控制器可以使用
$q.all()组合承诺
以确保Google API调用之间至少有10秒的延迟

angular.module( /* load your 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 your 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 also reject if AJAX errors.
            });

            return deferred.promise;
        }
    };
}]);


angular.module( /* load your module */ ).controller('geocodingController', ['delay', 'maps', '$q', function (delay, maps, $q) {
    var addresses = [/* An array of addresses to geocode */],
        addressIndex = 0,
        geocodeAddresses = function geocodeAddresses() {
            // Use $q.all so that the callback will execute when the geocoding is done AND 10 seconds have passed.
            $q.all([delay.start(), maps.geocode(addresses[addressIndex])]).then(function (results) {
                addressIndex += 1;
                var geocodedData = results[1]; // The geocode result is in the second index.

                // Do something with the results.

                if (addressIndex < addresses.length) {
                    geocodeAddresses();
                }
            });
        };

    // Kick off the AJAX requests.
    geocodeAddresses();
}]);
angular.module(/*加载您的模块*/).service('delay',['$q','$timeout',函数($q,$timeout){
返回{
开始:函数(){
var deferred=$q.deferred();
$timeout(deferred.resolve,10000);
回报。承诺;
}
};
}]);
角度.module(/*加载您的模块*/).service('maps',['$q',function($q){
var geocoder=new google.maps.geocoder();
返回{
地理编码:功能(地址){
var deferred=$q.deferred();
地理编码({
“地址”:地址
},功能(结果、状态){
延迟。解决(结果);
//如果AJAX出现错误,也应该拒绝。
});
回报。承诺;
}
};
}]);
角度.module(/*加载您的模块*/).controller('geocodingController',['delay','maps','$q',函数(delay,maps,$q){
var addresses=[/*一个地址数组,指向geocode*/],
addressIndex=0,
geocodeAddresses=函数geocodeAddresses(){
//使用$q.all,以便在地理编码完成且10秒过去时执行回调。
$q.all([delay.start(),maps.geocode(地址[addressIndex])))。然后(函数(结果){
地址索引+=1;
var geocodedData=results[1];//地理编码结果位于第二个索引中。
//对结果做点什么。
if(addressIndex
我认为您的
服务
实现类似于
工厂
angular.module( /* load your 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 your 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 also reject if AJAX errors.
            });

            return deferred.promise;
        }
    };
}]);


angular.module( /* load your module */ ).controller('geocodingController', ['delay', 'maps', '$q', function (delay, maps, $q) {
    var addresses = [/* An array of addresses to geocode */],
        addressIndex = 0,
        geocodeAddresses = function geocodeAddresses() {
            // Use $q.all so that the callback will execute when the geocoding is done AND 10 seconds have passed.
            $q.all([delay.start(), maps.geocode(addresses[addressIndex])]).then(function (results) {
                addressIndex += 1;
                var geocodedData = results[1]; // The geocode result is in the second index.

                // Do something with the results.

                if (addressIndex < addresses.length) {
                    geocodeAddresses();
                }
            });
        };

    // Kick off the AJAX requests.
    geocodeAddresses();
}]);