EDIT:
Lupa mengatakan bahwa solusi ini murni js, satu-satunya hal yang Anda butuhkan adalah browser yang mendukung promise https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Promise
Bagi mereka yang masih perlu melakukannya, saya telah menulis solusi saya sendiri yang menggabungkan janji dengan batas waktu.
Kode:
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);
}
});
}
};
Harap dicatat bahwa ini hanya bagian dari perpustakaan yang lebih besar yang saya tulis untuk menangani hal-hal peta google, maka komentar mungkin membingungkan.
Penggunaannya cukup sederhana, namun pendekatannya sedikit berbeda: alih-alih mengulang dan menyelesaikan satu alamat pada satu waktu, Anda perlu meneruskan array alamat ke kelas dan itu akan menangani pencarian dengan sendirinya, mengembalikan sebuah janji yang , ketika diselesaikan, mengembalikan larik yang berisi semua alamat yang diselesaikan (dan tidak terselesaikan).
Contoh:
var myAmazingGeo = new Geolocalizer();
var locations = ["Italy","California","Dragons are thugs...","China","Georgia"];
myAmazingGeo.Localize(locations).then(function(res){
console.log(res);
});
Keluaran konsol:
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
Objek dikembalikan:
Seluruh keajaiban terjadi di sini:
(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);
Pada dasarnya, ini mengulang setiap item dengan penundaan 750 milidetik di antara mereka masing-masing, maka setiap 750 milidetik sebuah alamat dikendalikan.
Saya telah melakukan beberapa pengujian lebih lanjut dan saya menemukan bahwa bahkan pada 700 milidetik saya terkadang mendapatkan kesalahan QUERY_LIMIT, sedangkan dengan 750 saya tidak mengalami masalah sama sekali.
Bagaimanapun, silakan edit 750 di atas jika Anda merasa aman dengan menangani penundaan yang lebih rendah.
Semoga ini membantu seseorang dalam waktu dekat;)