সুতরাং, মূলত আপনি জিজ্ঞাসা করছেন এই দুটিয়ের মধ্যে পার্থক্য কী ( p
পূর্ববর্তী কোড থেকে তৈরি একটি প্রতিশ্রুতি কোথায় ):
return p.then(...).catch(...);
এবং
return p.catch(...).then(...);
পার্থক্যগুলি হয় পি যখন সমাধান করে বা প্রত্যাখ্যান করে তবে এই পার্থক্যগুলি বিবেচনা করে কিনা তা নির্ভর করে না ভিতরে .then()
বা .catch()
হ্যান্ডলারের কোডটি কী করে তার উপর নির্ভর করে।
p
সমাধান হলে কী হয় :
প্রথম স্কিমে, যখন p
সমাধান হয়, .then()
হ্যান্ডলারকে ডাকা হয়। যদি সেই .then()
হ্যান্ডলারটি হয় কোনও মান বা অন্য কোনও প্রতিশ্রুতি দেয় যা অবশেষে সমাধান হয় তবে .catch()
হ্যান্ডলারটি এড়িয়ে যায়। তবে, যদি .then()
হ্যান্ডলারটি হয় এমন কোনও প্রতিশ্রুতি ছুঁড়ে দেয় বা প্রত্যাবর্তন করে যা শেষ পর্যন্ত প্রত্যাখ্যান করে, তবে .catch()
হ্যান্ডলারটি মূল প্রতিশ্রুতি প্রত্যাখাত উভয়ের জন্য কার্যকর করা হবে p
, তবে .then()
হ্যান্ডলারের মধ্যে উপস্থিত একটি ত্রুটিও রয়েছে।
দ্বিতীয় স্কিমে, যখন p
সমাধান হয়, .then()
হ্যান্ডলারকে ডাকা হয়। যদি সেই .then()
হ্যান্ডলারটি ছুঁড়ে ফেলে বা কোনও প্রতিশ্রুতি দেয় যা অবশেষে প্রত্যাখ্যান করে তবে .catch()
হ্যান্ডলারটি এটি ধরতে পারে না কারণ এটি শৃঙ্খলে থাকা আগে before
সুতরাং, পার্থক্য # 1। যদি .catch()
হ্যান্ডলারটি পরে থাকে তবে এটি .then()
হ্যান্ডলারের ভিতরে ত্রুটিগুলিও ধরতে পারে ।
p
প্রত্যাখ্যান করলে কী ঘটে :
এখন, প্রথম স্কিমে, যদি প্রতিশ্রুতি p
প্রত্যাখ্যান হয়, তবে .then()
হ্যান্ডলারটি এড়ানো হবে এবং .catch()
হ্যান্ডলারটি আপনার প্রত্যাশা অনুযায়ী কল করা হবে। .catch()
হ্যান্ডলারে আপনি যা করেন তা চূড়ান্ত ফলাফল হিসাবে কী ফিরে আসে তা নির্ধারণ করে। আপনি যদি .catch()
হ্যান্ডলারের কাছ থেকে কেবল কোনও মান ফিরিয়ে দেন বা এমন প্রতিশ্রুতি ফিরিয়ে দেন যা অবশেষে সমাধান হয়, তবে প্রতিশ্রুতি শৃঙ্খলা সমাধান অবস্থায় ফিরে আসে কারণ আপনি ত্রুটিটি "পরিচালনা করেছেন" এবং সাধারণত ফিরে এসেছেন normal আপনি যদি .catch()
হ্যান্ডলারের মধ্যে প্রত্যাখ্যাত প্রতিশ্রুতিটি ফেলে দেন বা প্রত্যাবর্তন করেন তবে প্রত্যাশিত প্রতিশ্রুতি বাতিল হয়ে যায়।
দ্বিতীয় স্কিমে, প্রতিশ্রুতি যদি p
প্রত্যাখ্যান করে তবে .catch()
হ্যান্ডলারটি কল করা হবে। যদি আপনি একটি সাধারণ মান বা কোনও প্রতিশ্রুতি ফিরিয়ে দেন যা অবশেষে .catch()
হ্যান্ডলারের কাছ থেকে সমাধান হয় (এইভাবে ত্রুটিটি "পরিচালনা করে"), তবে প্রতিশ্রুতি শৃঙ্খলা সমাধানের স্থানে স্যুইচ হয়ে যায় এবং .then()
উইন্ডেলের পরে হ্যান্ডলারকে .catch()
ডাকা হবে।
সুতরাং যে পার্থক্য # 2। যদি .catch()
হ্যান্ডলারটি আগে থাকে তবে তা ত্রুটিটি .then()
পরিচালনা করতে পারে এবং হ্যান্ডলারটিকে এখনও কল করার অনুমতি দেয় ।
কখন ব্যবহার করবেন:
প্রথম স্কিমটি ব্যবহার করুন যদি আপনি কেবলমাত্র একটি .catch()
হ্যান্ডলার চান যা মূল প্রতিশ্রুতি p
বা .then()
হ্যান্ডলারের মধ্যে ত্রুটিগুলি ধরতে পারে এবং হ্যান্ডলারটি p
বাদ দেওয়া উচিত তবে এটি থেকে প্রত্যাখ্যান করুন .then()
।
আপনি যদি মূল প্রতিশ্রুতিতে ত্রুটিগুলি ধরতে সক্ষম হতে চান p
এবং (শর্তের উপর নির্ভর করে) দ্বিতীয় স্কিমটি ব্যবহার করুন , প্রতিশ্রুতি শৃঙ্খলাটিকে সমাধান হিসাবে চালিয়ে যেতে দিন, যাতে .then()
হ্যান্ডলারটি কার্যকর করা হয় ।
অন্য বিকল্প
উভয় কলব্যাক ব্যবহার করার জন্য অন্য একটি অপশন রয়েছে যা আপনি এতে প্রবেশ করতে পারেন .then()
:
p.then(fn1, fn2)
এটি গ্যারান্টি দেয় যে কেবল একটি fn1
বা fn2
কখনও কল করা হবে। যদি p
সমাধান হয় তবে fn1
ডাকা হবে। যদি p
প্রত্যাখ্যান হয়, তবে fn2
ডাকা হবে। ফলাফলের কোনও পরিবর্তন fn1
কখনও কল করা fn2
বা বিপরীত হতে পারে না। সুতরাং, যদি আপনি একেবারে নিশ্চিত করতে চান যে হ্যান্ডলারের নিজেরাই যা ঘটে তা নির্বিশেষে আপনার দুটি হ্যান্ডলারের মধ্যে কেবল একজনকে ডাকা হয় তবে আপনি ব্যবহার করতে পারেন p.then(fn1, fn2)
।