সম্পাদনা:
এই সমাধানটি খাঁটি জেএসে রয়েছে তা ভুলে গেছেন, আপনার কেবলমাত্র প্রয়োজন এমন একটি ব্রাউজার যা https://developer.mozilla.org/it/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / প্রচারের প্রতিশ্রুতি দেয়
যাদের এখনও এখনও এটি সম্পাদন করা দরকার তাদের জন্য আমি আমার নিজস্ব সমাধান লিখেছি যা প্রতিশ্রুতিগুলির সাথে সময়সীমা মিশ্রিত করে।
কোড:
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 টি সম্পাদনা করুন feel
আশা করি এটি নিকট ভবিষ্যতে কাউকে সহায়তা করবে;)