BIÊN TẬP:
Quên nói rằng giải pháp này là trong js thuần túy, điều duy nhất bạn cần là một trình duyệt hỗ trợ các hứa hẹn https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise
Đối với những người vẫn cần phải hoàn thành như vậy, tôi đã viết giải pháp của riêng mình kết hợp lời hứa với thời gian chờ.
Mã:
var Geolocalizer = function () {
this.queue = [];
this.resolved = [];
this.geolocalizer = new google.maps.Geocoder();
};
Geolocalizer.prototype = {
Localize: function ( needles ) {
var that = this;
for ( var i = 0; i < needles.length; i++ ) {
this.queue.push(needles[i]);
}
return new Promise (
function (resolve, reject) {
that.resolveQueueElements().then(function(resolved){
resolve(resolved);
that.queue = [];
that.resolved = [];
});
}
);
},
resolveQueueElements: function (callback) {
var that = this;
return new Promise(
function(resolve, reject) {
(function loopWithDelay(such, queue, i){
console.log("Attempting the resolution of " +queue[i-1]);
setTimeout(function(){
such.find(queue[i-1], function(res){
such.resolved.push(res);
});
if (--i) {
loopWithDelay(such,queue,i);
}
}, 1000);
})(that, that.queue, that.queue.length);
var it = setInterval(function(){
if (that.queue.length == that.resolved.length) {
resolve(that.resolved);
clearInterval(it);
}
}, 1000);
}
);
},
find: function (s, callback) {
this.geolocalizer.geocode({
"address": s
}, function(res, status){
if (status == google.maps.GeocoderStatus.OK) {
var r = {
originalString: s,
lat: res[0].geometry.location.lat(),
lng: res[0].geometry.location.lng()
};
callback(r);
}
else {
callback(undefined);
console.log(status);
console.log("could not locate " + s);
}
});
}
};
Xin lưu ý rằng nó chỉ là một phần của thư viện lớn hơn mà tôi đã viết để xử lý nội dung bản đồ google, do đó các nhận xét có thể gây nhầm lẫn.
Cách sử dụng khá đơn giản, tuy nhiên, cách tiếp cận hơi khác: thay vì lặp lại và giải quyết từng địa chỉ một, bạn sẽ cần chuyển một mảng địa chỉ cho lớp và nó sẽ tự xử lý tìm kiếm, trả về một lời hứa. , khi được giải quyết, trả về một mảng chứa tất cả địa chỉ đã được giải quyết (và chưa được giải quyết).
Thí dụ:
var myAmazingGeo = new Geolocalizer();
var locations = ["Italy","California","Dragons are thugs...","China","Georgia"];
myAmazingGeo.Localize(locations).then(function(res){
console.log(res);
});
Đầu ra bảng điều khiển:
Attempting the resolution of Georgia
Attempting the resolution of China
Attempting the resolution of Dragons are thugs...
Attempting the resolution of California
ZERO_RESULTS
could not locate Dragons are thugs...
Attempting the resolution of Italy
Đối tượng được trả lại:
Toàn bộ điều kỳ diệu xảy ra ở đây:
(function loopWithDelay(such, queue, i){
console.log("Attempting the resolution of " +queue[i-1]);
setTimeout(function(){
such.find(queue[i-1], function(res){
such.resolved.push(res);
});
if (--i) {
loopWithDelay(such,queue,i);
}
}, 750);
})(that, that.queue, that.queue.length);
Về cơ bản, nó lặp lại mọi mục với độ trễ là 750 mili giây giữa mỗi mục, do đó cứ mỗi 750 mili giây thì một địa chỉ được kiểm soát.
Tôi đã thực hiện một số thử nghiệm khác và tôi phát hiện ra rằng ngay cả ở 700 mili giây, đôi khi tôi vẫn gặp lỗi QUERY_LIMIT, trong khi với 750, tôi không gặp bất kỳ sự cố nào.
Trong mọi trường hợp, vui lòng chỉnh sửa 750 ở trên nếu bạn cảm thấy an toàn bằng cách xử lý độ trễ thấp hơn.
Hy vọng điều này sẽ giúp ai đó trong tương lai gần;)