আপনি আপনার কোডটির সাথে খুব সুনির্দিষ্ট হন নি, তাই আমি একটি দৃশ্যধারণ করব। ধরা যাক আপনার কাছে 10 টি অজ্যাক্স কল রয়েছে এবং আপনি সেই 10 টি আজাক্স কল থেকে ফলাফল সংগ্রহ করতে চান এবং তারপরে যখন তারা সমস্ত সম্পন্ন করেন আপনি কিছু করতে চান। আপনি এটিতে এটি অ্যারে ডেটা সংগ্রহ করে এবং শেষটি কখন শেষ করবেন তা ট্র্যাক করে রেখে এটি করতে পারেন:
ম্যানুয়াল কাউন্টার
var ajaxCallsRemaining = 10;
var returnedData = [];
for (var i = 0; i < 10; i++) {
doAjax(whatever, function(response) {
returnedData.push(response);
--ajaxCallsRemaining;
if (ajaxCallsRemaining <= 0) {
}
});
}
দ্রষ্টব্য: এখানে ত্রুটি পরিচালনার বিষয়টি গুরুত্বপূর্ণ (এটি দেখানো হয়নি কারণ আপনি কীভাবে আপনার এজ্যাক্স কল করছেন তা নির্দিষ্ট করে)। যখন কোনও এজ্যাক্স কলটি কখনই সম্পূর্ণ হয় না হয় ত্রুটি সহকারে বা দীর্ঘ সময়ের জন্য আটকে যায় বা দীর্ঘ সময় পরে আউট হয়ে যায় আপনি কীভাবে আপনি কেস পরিচালনা করতে চলেছেন তা সম্পর্কে আপনি ভাবতে চাইবেন।
jQuery প্রতিশ্রুতি
২০১৪ সালে আমার উত্তরে যোগ করা These আজকাল, প্রতিশ্রুতিগুলি প্রায়শই এই ধরণের সমস্যা সমাধানের জন্য ব্যবহৃত হয় যেহেতু jQuery এর $.ajax()
ইতিমধ্যে একটি প্রতিশ্রুতি প্রত্যাবর্তন করেছে এবং $.when()
যখন আপনাকে প্রতিশ্রুতিগুলির একটি গোষ্ঠী সমস্ত সমাধান হয়ে যায় এবং আপনাকে ফলাফলগুলি সংগ্রহ করবে:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push($.ajax(...));
}
$.when.apply($, promises).then(function() {
}, function() {
});
ES6 স্ট্যান্ডার্ড প্রতিশ্রুতি
কেবিএর উত্তরে যেমন উল্লেখ করা হয়েছে : আপনার যদি অভ্যন্তরীণ প্রতিশ্রুতিগুলি অন্তর্নির্মিত (আধুনিক ব্রাউজার বা নোড.জেএস বা ব্যাবেলজ ট্রান্সপাইল ব্যবহার করে বা একটি প্রতিশ্রুতি পলফিল ব্যবহার করে) পরিবেশ থাকে তবে আপনি ES6- নির্দিষ্ট প্রতিশ্রুতি ব্যবহার করতে পারেন। ব্রাউজার সমর্থনের জন্য এই টেবিলটি দেখুন । প্রতিশ্রুতিগুলি IE বাদে বেশ কয়েকটি বর্তমান ব্রাউজারগুলিতে সমর্থিত।
যদি doAjax()
কোনও প্রতিশ্রুতি দেয়, তবে আপনি এটি করতে পারেন:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
}, function(err) {
});
যদি আপনাকে কোনও প্রতিশ্রুতি ফেরত দেয় এমন একটি অ-প্রতিশ্রুতি অ্যাসিঙ্ক অপারেশন করার দরকার হয় তবে আপনি এটি "প্রতিশ্রুতি" দিতে পারেন:
function doAjax(...) {
return new Promise(function(resolve, reject) {
someAsyncOperation(..., function(err, result) {
if (err) return reject(err);
resolve(result);
});
});
}
এবং, তারপরে উপরের প্যাটার্নটি ব্যবহার করুন:
var promises = [];
for (var i = 0; i < 10; i++) {
promises.push(doAjax(...));
}
Promise.all(promises).then(function() {
}, function(err) {
});
ব্লুবার্ড প্রতিশ্রুতি
আপনি যদি ব্লুবার্ড প্রতিশ্রুতি লাইব্রেরির মতো আরও বৈশিষ্ট্য সমৃদ্ধ গ্রন্থাগার ব্যবহার করেন তবে এটি আরও সহজ করার জন্য এতে আরও কিছু অতিরিক্ত ফাংশন রয়েছে:
var doAjax = Promise.promisify(someAsync);
var someData = [...]
Promise.map(someData, doAjax).then(function(results) {
}, function(err) {
});