সুস্পষ্ট পাস-মাধ্যমে
কলব্যাকগুলিকে বাসা বাঁধার অনুরূপ, এই কৌশলটি ক্লোজারগুলিতে নির্ভর করে। তবুও, চেইনটি সমতল থাকে - কেবল সর্বশেষ ফলাফলটি পাস করার পরিবর্তে প্রতিটি পদক্ষেপের জন্য কিছু স্টেট অবজেক্ট পাস হয়। এই রাষ্ট্রীয় অবজেক্টগুলি পূর্ববর্তী ক্রিয়াকলাপগুলির ফলাফলগুলি সঞ্চিত করে, সমস্ত মানগুলিকে হস্তান্তর করে যা পরে প্রয়োজন হবে এবং বর্তমান কার্যের ফলাফল।
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(b => [resultA, b]); // function(b) { return [resultA, b] }
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
এখানে, এই ছোট তীর b => [resultA, b]
হ'ল ফাংশন যা বন্ধ হয়ে resultA
যায় এবং উভয় ফলাফলের অ্যারেটি পরবর্তী ধাপে পাস করে। এটি আবার একক ভেরিয়েবলগুলিতে ব্রেক আপ করতে প্যারামিটার ডেস্ট্রাকচারিং সিনট্যাক্স ব্যবহার করে।
ES6 এর সাথে ডেস্ট্রাকচারিং উপলব্ধ হওয়ার আগে, একটি নিমফ হেল্পার পদ্ধতিটি .spread()
অনেক প্রতিশ্রুতি পাঠাগারগুলি সরবরাহ করেছিল ( কিউ , ব্লুবার্ড , কখন , ...)। এটি একাধিক পরামিতি সহ একটি ফাংশন নেয় - প্রতিটি অ্যারে উপাদানগুলির জন্য একটি - হিসাবে ব্যবহৃত হয় .spread(function(resultA, resultB) { …
।
অবশ্যই, এখানে যে ক্লোজারটির প্রয়োজন রয়েছে সেটি আরও কিছু সহায়ক ফাংশন দ্বারা সরল করা যেতে পারে, যেমন
function addTo(x) {
// imagine complex `arguments` fiddling or anything that helps usability
// but you get the idea with this simple one:
return res => [x, res];
}
…
return promiseB(…).then(addTo(resultA));
বিকল্পভাবে, আপনি Promise.all
অ্যারের প্রতিশ্রুতি উত্পাদন করতে নিয়োগ করতে পারেন :
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return Promise.all([resultA, promiseB(…)]); // resultA will implicitly be wrapped
// as if passed to Promise.resolve()
}).then(function([resultA, resultB]) {
// more processing
return // something using both resultA and resultB
});
}
এবং আপনি কেবল অ্যারে ব্যবহার করতে পারেন না, কিন্তু নির্বিচারে জটিল বস্তু। উদাহরণস্বরূপ, সঙ্গে _.extend
বাObject.assign
একটি ভিন্ন সহায়ক ফাংশন এর :
function augment(obj, name) {
return function (res) { var r = Object.assign({}, obj); r[name] = res; return r; };
}
function getExample() {
return promiseA(…).then(function(resultA) {
// some processing
return promiseB(…).then(augment({resultA}, "resultB"));
}).then(function(obj) {
// more processing
return // something using both obj.resultA and obj.resultB
});
}
যদিও এই নিদর্শনটি একটি সমতল শৃঙ্খলার গ্যারান্টি দেয় এবং স্পষ্টত রাষ্ট্রীয় বস্তু স্বচ্ছতার উন্নতি করতে পারে, এটি দীর্ঘ শৃঙ্খলার জন্য ক্লান্তিকর হয়ে উঠবে। বিশেষত যখন আপনাকে কেবল বিক্ষিপ্তভাবে রাজ্যের প্রয়োজন হয়, তবুও আপনাকে প্রতিটি পদক্ষেপের মধ্য দিয়ে যেতে হবে। এই স্থির ইন্টারফেসের সাথে, চেইনের একক কলব্যাকগুলি বরং শক্তভাবে মিলিত এবং পরিবর্তনের জন্য জটিল। এটি একক পদক্ষেপগুলিকে আরও শক্ত করে তোলে, এবং কলব্যাকগুলি অন্য মডিউল থেকে সরাসরি সরবরাহ করা যায় না - তাদের সর্বদা বয়লারপ্লেট কোডে আবৃত করা দরকার যা রাষ্ট্রের যত্নশীল। উপরের মতো বিমূর্ত সাহায্যকারী ফাংশনগুলি ব্যথাটিকে কিছুটা সহজ করতে পারে তবে এটি সর্বদা উপস্থিত থাকবে।
javascript
অন্যান্য ভাষায় প্রাসঙ্গিক। আমি কেবল জাভা এবং জেডিফার্ডে "ব্রেক চেইন" উত্তরটি ব্যবহার করি