এখানে একটি অনুলিপি-প্রচ্ছন্ন বন্ধুত্বপূর্ণ এবং বৈশিষ্ট্য সম্পূর্ণ Promise.all()
/ map()
বিকল্প, সম্মতিসীমা সীমা সহ আমার ES7 সমাধান ।
Promise.all()
এটি অনুরূপ রিটার্ন অর্ডার বজায় রাখার পাশাপাশি অ-প্রতিশ্রুতি ফেরতের মানগুলির জন্য একটি ফলব্যাক।
আমি বিভিন্ন বাস্তবায়নের তুলনাও অন্তর্ভুক্ত করেছি কারণ এটি অন্যান্য দিকগুলির কয়েকটি সমাধান মিস করেছে বলে কিছু দিক বর্ণনা করে।
ব্যবহার
const asyncFn = delay => new Promise(resolve => setTimeout(() => resolve(), delay));
const args = [30, 20, 15, 10];
await asyncPool(args, arg => asyncFn(arg), 4);
বাস্তবায়ন
async function asyncBatch(args, fn, limit = 8) {
args = [...args];
const outs = [];
while (args.length) {
const batch = args.splice(0, limit);
const out = await Promise.all(batch.map(fn));
outs.push(...out);
}
return outs;
}
async function asyncPool(args, fn, limit = 8) {
return new Promise((resolve) => {
const argQueue = [...args].reverse();
let count = 0;
const outs = [];
const pollNext = () => {
if (argQueue.length === 0 && count === 0) {
resolve(outs);
} else {
while (count < limit && argQueue.length) {
const index = args.length - argQueue.length;
const arg = argQueue.pop();
count += 1;
const out = fn(arg);
const processOut = (out, index) => {
outs[index] = out;
count -= 1;
pollNext();
};
if (typeof out === 'object' && out.then) {
out.then(out => processOut(out, index));
} else {
processOut(out, index);
}
}
}
};
pollNext();
});
}
তুলনা
const asyncFn = delay => new Promise(resolve => setTimeout(() => {
console.log(delay);
resolve(delay);
}, delay));
const args = [30, 20, 15, 10];
const out1 = await Promise.all(args.map(arg => asyncFn(arg)));
const out2 = await asyncPool(args, arg => asyncFn(arg), 2);
const out3 = await asyncBatch(args, arg => asyncFn(arg), 2);
console.log(out1, out2, out3);
উপসংহার
asyncPool()
এটি সর্বোত্তম সমাধান হওয়া উচিত কারণ এটি আগের অনুরোধ শেষ হওয়ার সাথে সাথেই নতুন অনুরোধগুলি শুরু করার অনুমতি দেয়।
asyncBatch()
এর বাস্তবায়ন বোঝার জন্য সহজ হিসাবে এটির তুলনা হিসাবে অন্তর্ভুক্ত করা হয়েছে, তবে এটি কার্যকরভাবে ধীর হওয়া উচিত কারণ পরবর্তী ব্যাচটি শুরু করতে একই ব্যাচের সমস্ত অনুরোধ শেষ করতে হবে।
এই দ্বন্দ্বযুক্ত উদাহরণে, অ-সীমাবদ্ধ ভ্যানিলা Promise.all()
অবশ্যই দ্রুততম, অন্যরা সত্যিকারের বিশ্বের ভিড়ের দৃশ্যে আরও আকাঙ্ক্ষিত পারফর্ম করতে পারে।
হালনাগাদ
অন্যরা ইতিমধ্যে প্রস্তাবিত অ্যাসিঙ্ক পুলের পাঠাগারটি সম্ভবত আমার বাস্তবায়নের জন্য আরও ভাল বিকল্প কারণ এটি প্রায় অভিন্নরূপে কাজ করে এবং প্রতিশ্রুতি.বর্গ () এর চতুর ব্যবহারের সাথে আরও সংক্ষিপ্ত বাস্তবায়ন রয়েছে: https://github.com/rxaviers/ async- পুল / ব্লব / মাস্টার / lib / es7.js
আশা করি আমার উত্তরটি এখনও একটি শিক্ষামূলক মূল্য পরিবেশন করতে পারে।