পূর্ববর্তী উত্তরগুলি ইতিমধ্যে বলেছে, Promise.allমূল প্রতিশ্রুতিগুলির ইনপুট ক্রমের সাথে সম্পর্কিত একটি অ্যারের সাথে সমস্ত সমাধান করা মানকে একত্রিত করে ( একত্রিত প্রতিশ্রুতি দেখুন )।
তবে, আমি উল্লেখ করতে চাই, ক্রমটি কেবল ক্লায়েন্টের পক্ষেই সংরক্ষিত!
বিকাশকারীকে দেখে মনে হয় প্রতিশ্রুতিগুলি যথাযথভাবে সম্পন্ন হয়েছে তবে বাস্তবে প্রতিশ্রুতিগুলি বিভিন্ন গতিতে প্রক্রিয়া করা হয়। আপনি যখন রিমোট ব্যাকএন্ডের সাথে কাজ করেন তা জানা গুরুত্বপূর্ণ কারণ ব্যাকএন্ডটি আপনার প্রতিশ্রুতিগুলি অন্য কোনও ক্রমে গ্রহণ করতে পারে।
এখানে একটি উদাহরণ যা টাইমআউটগুলি ব্যবহার করে সমস্যাটি দেখায়:
Promise.all
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
উপরে প্রদর্শিত কোডটিতে তিনটি প্রতিশ্রুতি (এ, বি, সি) দেওয়া হয়েছে Promise.all। তিনটি প্রতিশ্রুতি বিভিন্ন গতিতে কার্যকর করা হয় (সি সবচেয়ে দ্রুত এবং বি সবচেয়ে ধীর হচ্ছে)। এই কারণেই console.logপ্রতিশ্রুতিগুলির বিবৃতি এই ক্রমে প্রদর্শিত হয়:
C (fast)
A (slow)
B (slower)
প্রতিশ্রুতিগুলি যদি এজেএক্স কল হয়, তবে একটি দূরবর্তী ব্যাকএন্ড এই ক্রমে এই মানগুলি গ্রহণ করবে। তবে ক্লায়েন্টের পক্ষ থেকে Promise.allনিশ্চিত হয় যে ফলাফলগুলি myPromisesঅ্যারের মূল অবস্থান অনুসারে অর্ডার করা হয়েছে । সে কারণেই চূড়ান্ত ফলাফল:
['A (slow)', 'B (slower)', 'C (fast)']
আপনি যদি প্রতিশ্রুতিগুলির প্রকৃত বাস্তবায়নও গ্যারান্টি দিতে চান তবে আপনার প্রতিশ্রুতি সারির মতো ধারণা দরকার। এখানে পি-ক্যু ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে (সতর্কতা অবলম্বন করুন, আপনাকে সমস্ত প্রতিশ্রুতি ফাংশনগুলিতে আবদ্ধ করতে হবে):
সিকোয়েন্সিয়াল প্রতিশ্রুতি সারি
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
ফলাফল
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']