Max*_*tin 4 javascript ajax geocoding angularjs
我需要在循环中运行20-200个ajax请求但是不要伤害google.maps.Geocoder我想在每次调用之间设置延迟10秒.但是ajax请求是异步的,因此我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;
});
});
Run Code Online (Sandbox Code Playgroud)
接下来呢?
我可以添加如下内容:
stop = $timeout(function() {
if($scope.taskCurr <= $scope.taskCount){
geoTaskLoopAsync();
} else {
$timeout.cancel(stop);
}
}, 10000);
Run Code Online (Sandbox Code Playgroud)
或者我有其他方式?
谢谢,
这似乎是承诺和$q服务的一个很好的用例.
这是使用promises的样子的粗略草图.我声明一个延迟服务来处理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();
}]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2943 次 |
| 最近记录: |