संपादित करें:
यह कहना भूल गए कि यह समाधान शुद्ध js में है, केवल एक चीज जो आपको चाहिए वह है एक ब्राउज़र जो वादों का समर्थन करता है https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/romise
उन लोगों के लिए जिन्हें अभी भी ऐसा करने की आवश्यकता है, मैंने अपना स्वयं का समाधान लिखा है जो टाइमआउट के साथ वादों को जोड़ती है।
कोड:
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);
}
});
}
};
कृपया ध्यान दें कि यह एक बड़ी लाइब्रेरी का एक हिस्सा है जिसे मैंने गूगल मैप्स सामान को संभालने के लिए लिखा था, इसलिए टिप्पणियाँ भ्रमित हो सकती हैं।
उपयोग काफी सरल है, दृष्टिकोण, हालांकि, थोड़ा अलग है: एक समय में एक पते को लूप करने और हल करने के बजाय, आपको कक्षा में पते की एक सरणी को पास करने की आवश्यकता होगी और यह वादा करके खुद ही खोज को संभाल लेगा, जो , जब हल किया जाता है, एक सरणी को सभी हल किए गए (और अनसुलझे) पते देता है।
उदाहरण:
var myAmazingGeo = new Geolocalizer();
var locations = ["Italy","California","Dragons are thugs...","China","Georgia"];
myAmazingGeo.Localize(locations).then(function(res){
console.log(res);
});
कंसोल आउटपुट:
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
लौटाई गई वस्तु:
पूरा जादू यहां होता है:
(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);
मूल रूप से, यह प्रत्येक आइटम को 750 मिलीसेकेंड की देरी के साथ उनमें से प्रत्येक के बीच में जोड़ता है, इसलिए प्रत्येक 750 मिलीसेकंड एक पते को नियंत्रित किया जाता है।
मैंने कुछ और परीक्षण किए हैं और मुझे पता चला है कि 700 मिलीसेकंड पर भी मुझे कभी-कभी QUERY_LIMIT त्रुटि मिल रही थी, जबकि 750 के साथ मेरे पास कोई मुद्दा नहीं था।
किसी भी मामले में, ऊपर दिए गए 750 को संपादित करने के लिए स्वतंत्र महसूस करें यदि आपको लगता है कि आप कम देरी को संभालकर सुरक्षित हैं।
आशा है कि यह निकट भविष्य में किसी की मदद करता है;)