তার আগে এবং তারপরে ক্যাচের প্লেসমেন্ট


109

.catchনেস্টেড প্রতিশ্রুতি দেওয়ার আগে এবং তার আগে রাখার মধ্যে পার্থক্য বুঝতে আমার সমস্যা হয় ।

বিকল্প 1:

test1Async(10).then((res) => {
  return test2Async(22)
    .then((res) => {
      return test3Async(100);
    }).catch((err) => {
      throw "ERROR AFTER THEN";
    });
}).then((res) => {
  console.log(res);
}).catch((err) => {
  console.log(err);
});

বিকল্প 2:

test1Async(10).then((res) => {
   return test2Async(22)
     .catch((err) => {
        throw "ERROR BEFORE THEN";
      })
      .then((res) => {
        return test3Async(100);
      });
  }).then((res) => {
    console.log(res);
  }).catch((err) => {
    console.log(err);
  });

প্রতিটি ফাংশনের আচরণ অনুসরণ অনুসারে হয়, টেস্ট 1 ব্যর্থ হলে <0টেস্ট 1 ব্যর্থ হয় সংখ্যা 2 হলে টেস্ট 2 ব্যর্থ হয় > 10এবং টেস্ট 3 ব্যর্থ হয় যদি সংখ্যাটি না থাকে 100। এই ক্ষেত্রে টেস্ট 2 কেবলমাত্র ব্যর্থ।

আমি চালানোর চেষ্টা করেছিলাম এবং টেস্ট 2 এ্যাসেন্সকে ব্যর্থ করে দেওয়ার আগে এবং এর আগে উভয়ই একইভাবে আচরণ করি এবং এটি টেস্ট 3 এ্যাসেন্সকে কার্যকর করে না। কেউ আমাকে বিভিন্ন জায়গায় ক্যাচ রাখার মূল পার্থক্যটি ব্যাখ্যা করতে পারেন?

প্রতিটি ক্রিয়াকলাপে আমি console.log('Running test X')এটি সম্পাদন করে কিনা তা খতিয়ে দেখতে।

এই পোস্টটি আমার পূর্ববর্তী থ্রেডের কারণে উত্থিত হয়েছে যাতে নেস্টেড কলব্যাককে কীভাবে প্রতিশ্রুতিতে পরিণত করা যায়? । আমি এটি পৃথক সমস্যা এবং অন্য একটি বিষয় পোস্ট মূল্যবান।


উভয়। তারপর এবং ক্যাচ প্রতিশ্রুতি পাল্টাতে পারে ... সুতরাং ভুল ধারণাটি কোথা থেকে এসেছে তা আমি নিশ্চিত নই। আপনি .এর আগে যদি ক্যাচ রাখেন, তবে এটির আগে যা ঘটেছিল তা প্রত্যাখাত করে ফেলবে the
কেভিন বি

আমার প্রশ্নটি পরিষ্কার না হলে দুঃখিত। তবে এই ক্ষেত্রে আমি যেমন বলেছি, উভয় ক্ষেত্রেই একই রকম আচরণ করা হয় তাই আমি পার্থক্যটি দেখতে পাচ্ছি না। আপনি কি আমাকে বলতে পারবেন যে আমরা কখন আগে ধরা পরে থাকি এবং কখন আমরা এটির পরে রাখব? এটি পরে রাখা সত্যিই স্বজ্ঞাত এবং সাধারণ বলে মনে হচ্ছে। ঠিক কখনই না কেন আমরা কখনও কখনও এটি আগে রাখি তা নিশ্চিত না
জ্যাঙ্কো

যদি তারা একই কাজ করে তবে এটি কেবল কারণ প্রতিটি যা করে তা এই নির্দিষ্ট ক্ষেত্রে ফলাফলকে পরিবর্তন করে না। হয় একটি সামান্য পরিবর্তন ফলাফল পরিবর্তন করতে পারে।
কেভিন বি

"ফলাফল পরিবর্তন" বলতে আপনার অর্থ কী? দুঃখিত আমি সত্যিই বিভ্রান্ত হাহাহা
জ্যাঙ্কো

উদাহরণস্বরূপ, যদি কোনও ত্রুটি ছুঁড়ে ফেলার পরিবর্তে আপনি কিছু না করেন তবে প্রতিশ্রুতি সমাধানের দিকে প্রত্যাখ্যান করা থেকে স্যুইচ হয়ে যাবে। এটি অবশ্যই পরিণতি বদলে দেবে, কারণ প্রতিশ্রুতি এখন প্রত্যাখাত হওয়ার পরিবর্তে একটি সমাধান প্রতিশ্রুতি। (অবশ্যই যদি এটি ইতিমধ্যে সমাধান না করা হয়, তবে এক্ষেত্রে ক্যাচটি কোনওভাবেই চালিত হত না)
কেভিন বি

উত্তর:


250

সুতরাং, মূলত আপনি জিজ্ঞাসা করছেন এই দুটিয়ের মধ্যে পার্থক্য কী ( 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)


19
প্রশ্নটি বিশেষত ক্রম .then()এবং .catch()যেটির উত্তর আপনি। এছাড়াও আপনি কখন কোন অর্ডারটি ব্যবহার করবেন সে সম্পর্কে কিছু টিপস দিয়েছেন, যেখানে আমি তৃতীয় বিকল্পের উল্লেখ করা যথাযথ বলে মনে করি, যথা সাফল্য এবং ত্রুটি হ্যান্ডলার উভয়কেই পাস করে। তবু () । সেক্ষেত্রে সর্বাধিক একজন হ্যান্ডলারকে ডাকা হবে।
আরনেহুগো

9
@ আর্ন হুগো - ভাল পরামর্শ। আমি আরো বললাম.
jਫਰ00

সুতরাং, প্রতিশ্রুতি শৃঙ্খলা চলাকালীন আমরা কী লিখতে পারি .কেন। ক্যাচ .ক্যাচ .কেন ধরণের পরিস্থিতি?
কপিল রঘুওয়ানশি

@ কপিলরাগুওয়ানশি, হ্যাঁ, আপনি ব্যর্থতার ক্ষেত্রে এটি একটি ডিফল্ট মান পাস করতে ব্যবহার করতে পারেন। যেমন Promise.reject(new Error("F")).then(x => x).catch(e => {console.log(e); return [1]}).then(console.log)এবং Promise.resolve([2]).then(x => x).catch(e => [1]).then(console.log)
সার্ভ এড

4
@ দিমিত্রি শেভেদভ - যেমনটি আমি অনুমান করেছি, এটি ভুল .then(this.setState({isModalOpen: false}))। আপনি কোনও ফাংশন রেফারেন্সটি পাস করছেন না .then()যাতে প্যারেন্সে কোডটি সঙ্গে সঙ্গে কার্যকর করা হয় (প্রতিশ্রুতি সমাধানের আগে)। এটা হওয়া উচিত .then(() => this.setState({isModalOpen: false}))
j2300

33

jfriend00 এর উত্তরটি দুর্দান্ত, তবে আমি ভেবেছিলাম যে এটি অ্যালাঙ্গাস সিঙ্ক্রোনাস কোড যুক্ত করা ভাল ধারণা।

return p.then(...).catch(...);

সমকালীন অনুরূপ:

try {
  iMightThrow() // like `p`
  then()
} catch (err) {
  handleCatch()
}

যদি iMightThrow()ফেলে না দেয় then()তবে ডাকা হবে called যদি এটি নিক্ষেপ করে না (বা যদি then()নিজেই ছুড়ে দেয়), তবে handleCatch()ডাকা হবে। লক্ষ্য করুন কীভাবে catchব্লকটি thenডাকা হবে কি না তার উপরে কোনও নিয়ন্ত্রণ নেই ।

অন্য দিকে,

return p.catch(...).then(...);

সমকালীন অনুরূপ:

try {
  iMightThrow()
} catch (err) {
  handleCatch()
}

then()

এই ক্ষেত্রে, যদি iMightThrow()নিক্ষেপ না করে তবে then()কার্যকর করা হবে। যদি এটি নিক্ষেপ করে, তবে এটি ডাকা handleCatch()হবে কিনা then()তা সিদ্ধান্ত নেওয়া উচিত , কারণ যদি তা handleCatch()পুনরায় চালিত হয়, তবে then()ডাকা হবে না, যেহেতু ব্যতিক্রমটি অবিলম্বে কলারের কাছে নিক্ষেপ করা হবে। যদি দয়া handleCatch()করে সমস্যাটি পরিচালনা then()করতে পারে তবে ডাকা হবে।


এই ভাল ব্যাখ্যা কিন্তু আপনি এতিম মোড়ানো পারে then()একটিfinally{...}
tyskr

4
@ ৮২ টি টুকার্স, আপনি কি নিশ্চিত? যদি আমি করা then()মধ্যে finally{...}, এটা ভুল বলা হবে না এমনকি যদি handleCatch()ছোঁড়ার? মনে রাখবেন যে আমার লক্ষ্যটি ছিল
আনলজ

সুতরাং, আমরা যদি সমস্ত কেসগুলি পরিচালনা করতে চাই তবে তবুও চেইন। তবে () এটি ব্যবহার করা ভাল। তাহলে (কিছু করুন) do যেখানে আমরা প্রতিটি পয়েন্টে ধরার চেষ্টা করি কিন্তু স্টেমেন্টগুলি চালিয়ে যেতে চালিত করি?
আনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.