ফেরতের মান বা প্রতিশ্রুতির মধ্যে তফাত কী then তখন থেকেই সমাধান করুন ()


314

পার্থক্য কি:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return "bbb";
  })
  .then(function(result) {
    console.log(result);
  });

এবং এই:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return Promise.resolve("bbb");
  })
  .then(function(result) {
    console.log(result);
  });

আমি জিজ্ঞাসা করছি যে শৃঙ্খলাবদ্ধ সহ কৌণিক এবং $ HT পরিষেবা ব্যবহার করে আমি বিভিন্ন আচরণ পাচ্ছি then (()। কিছুটা বেশি কোড তাই প্রথমে উপরের উদাহরণটি।


1
কী "ভিন্ন আচরণ" দেখছেন? উভয় উদাহরণের কাজ করা উচিত এবং প্রায় একই রকম আচরণ করা উচিত। Promise.resolve()দ্বিতীয় উদাহরণে অপ্রয়োজনীয়।
JLRishe

4
@ পিক্সেলবিত্স thenহ্যান্ডলারের কাছ থেকে প্রতিশ্রুতি ফিরিয়ে দেওয়ার ক্ষেত্রে যা কিছু ভুল নেই , বাস্তবে, প্রতিশ্রুতির একটি মূল দিকটি নির্দিষ্ট করে যে আপনি এটি করতে পারেন।

নোট করুন যে এটি নির্বিচারে নেস্টেড thens- এর সাথে কাজ করে - এর জন্য 'অন্যান্য ভাষাগুলি' শব্দটি thenএটি a mapএবং a উভয়ই flatMap
বেনিয়ামিন গ্রুইনবাউম

1
লাইন 2 এ আপনাকে কেন পুনরায় কল করতে হবে ("আআআ"), কেন "আআ" যথেষ্ট হবে না এবং প্রতিশ্রুতি সমাধানের জন্য এটি কীভাবে প্রত্যাখ্যান () এর ব্যতিক্রম ধরা পড়ে?
স্যাম লিডিকোট

1
@ সামলিডিকোট একই প্রশ্ন রাখে, খনিগুলি যখন আরও কিছুটা জটিল হয়: new Promise((res, rej) => { return fetch('//google.com').then(() => { return "haha"; }) }).then((result) => alert(result));এই কোডটি কেবল স্থায়ী হবে (চিরদিনের জন্য সমাধান হয়নি)। তবে আমি যদি তখন পরিবর্তন return "haha";করি return res("haha");তবে এটি কাজ করবে এবং "হাহা" সতর্ক করবে। ()। তবে () ইতিমধ্যে "হাহা" কে সমাধানের প্রতিশ্রুতিতে জড়িয়ে রাখেনি?
শাং চেং

উত্তর:


138

নিয়ম হল, ফাংশন রয়েছে যে যদি thenহ্যান্ডলার যে মান সঙ্গে একটি মান, প্রতিশ্রুতি সমাধান করা / প্রত্যাখ্যান ফেরৎ, এবং ফাংশন একটি প্রতিশ্রুতি ফেরৎ যদি, যা হওয়ার তাই হল, পরবর্তী thenদফা হতে হবে thenদফা ফাংশন ফিরে প্রতিজ্ঞা , তাই এই ক্ষেত্রে, প্রথম উদাহরণ স্বাভাবিক ক্রম মাধ্যমে বৃক্ষের পতন thensএবং কপি করে প্রিন্ট আউট মান এক আশা করতে পারে, দ্বিতীয় উদাহরণে, প্রতিশ্রুতি অবজেক্ট ফিরিয়ে পরার যে যখন আপনাকে যা Promise.resolve("bbb")s 'তারপরthen যে যখন chaining প্রার্থনা পরার (সকল অভিপ্রায় ও উদ্দেশ্যের জন্য). এটি যেভাবে বাস্তবে কাজ করে তা আরও বিশদে নীচে বর্ণিত।

প্রতিশ্রুতি / এ + বিশেষ থেকে উদ্ধৃতি:

প্রতিশ্রুতি সমাধানের পদ্ধতিটি একটি বিমূর্ত অপারেশন যা ইনপুট হিসাবে প্রতিশ্রুতি এবং একটি মান হিসাবে গ্রহণ করে, যা আমরা হিসাবে চিহ্নিত করি [[Resolve]](promise, x)যদি xএকটি তাত্পর্যযোগ্য হয় তবে এটি প্রতিশ্রুতিবদ্ধ অবস্থার উপরx নির্ভর করে প্রতিশ্রুতি দেওয়ার চেষ্টা করে যে এক্স অন্তত কিছুটা প্রতিশ্রুতির মতো আচরণ করে । অন্যথায়, এটি মান সহ প্রতিশ্রুতি পূরণ করে x

তত্ক্ষণযোগ্যদের এই চিকিত্সা প্রতিশ্রুতি বাস্তবায়নকে আন্তঃক্রিয়াবদ্ধ করতে মঞ্জুরি দেয়, যতক্ষণ না তারা কোনও প্রতিশ্রুতি / এ + -সম্পাদক তত্ক্ষণাত পদ্ধতিটি প্রকাশ করে। এটি প্রতিশ্রুতিবদ্ধ / এ + বাস্তবায়নকে যুক্তিসঙ্গত তারপর পদ্ধতিগুলির সাথে নন-কনফর্মেন্ট বাস্তবায়নগুলিকে "একীকরণ" করতে সহায়তা করে।

এখানে লক্ষ্য করার মূল বিষয়টি হ'ল এই লাইনটি:

যদি xকোন প্রতিশ্রুতি থাকে তবে তার রাষ্ট্রটি গ্রহণ করুন [৩.৪]

লিঙ্ক: https://promisesaplus.com/#Point-49


4
যখন কোনও thenহ্যান্ডলার কোনও প্রতিশ্রুতি ফিরিয়ে দেয় তখন আচরণটি প্রকাশ করার জন্য "তার রাজ্যটিকে অবলম্বন করুন" একটি সংক্ষিপ্ত এবং দরকারী উপায় । নির্দিষ্ট রেফারেন্সের জন্য +1।

69
প্রকৃতপক্ষে - এখানে অনুচ্ছেদের প্রাসঙ্গিক অংশটি হ'ল সত্য যা [[Resolve]]উভয়কে সক্ষম thenএবং মূল্যবোধের ভিত্তিতে বলা হয় তাই মূলত এটি প্রতিশ্রুতির সাথে একটি মানকে আবৃত return "aaa"করে যেমন একই return Promise.resolve("aaa")এবং return Promise.resolve("aaa")একইরকম return Promise.resolve(Promise.resolve("aaa"))- কারণ সংকল্প আদর্শহীন তাকে আরও একটি মূল্যে ডাকছে একবারে একই ফলাফল হয়েছে।
বেনিয়ামিন গ্রুইনবাউম

8
@ বেনজামিন গ্রুয়েনবাউম এর অর্থ কি এই যে প্রত্যাবর্তন "aaa"এবং কোনও অবস্থাতেই অক্ষম হয় ? return Promise.resolve("aaa")then
সিএসনার্ড

9
হ্যাঁ, এর অর্থ হ'ল এটি।
বেনজামিন গ্রুয়েনবুম

118

thenহ্যান্ডলার ফাংশনের অভ্যন্তরে সহজ কথায় :

ক) কখন xএকটি মান (সংখ্যা, স্ট্রিং ইত্যাদি):

  1. return x সমতুল্য return Promise.resolve(x)
  2. throw x সমতুল্য return Promise.reject(x)

খ) xইতিমধ্যে নিষ্পত্তি হওয়া কোনও প্রতিশ্রুতি কখন হয় (আর মুলতুবি নেই):

  1. return x সমতুল্য return Promise.resolve(x) , যদি প্রতিশ্রুতি ইতিমধ্যে সমাধান করা হয়।
  2. return xএর সমতুল্য return Promise.reject(x), যদি প্রতিশ্রুতি ইতিমধ্যে বাতিল হয়ে যায়।

গ) কখন xযে প্রতিশ্রুতি মুলতুবি রয়েছে:

  1. return xএকটি মুলতুবি প্রতিশ্রুতি ফিরিয়ে দেবে এবং পরবর্তী সময়ে এটি মূল্যায়ন করা হবে then

প্রতিশ্রুতি.প্রোটোটাইপ.পিন () ডক্সে এই বিষয়ে আরও পড়ুন ।


92

আপনার উদাহরণ দুটিই বেশ একই রকম আচরণ করা উচিত।

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

আপনার প্রথম উদাহরণে, আপনি "bbb"প্রথম then()হ্যান্ডলারটিতে ফিরে আসেন , তাই "bbb"পরবর্তীটিতে স্থানান্তরিত হয়then() হ্যান্ডলারের ।

আপনার দ্বিতীয় উদাহরণে, আপনি এমন প্রতিশ্রুতি ফিরিয়ে দেন যা মানের সাথে সাথে সমাধান করা হয় "bbb", তাই "bbb"পরবর্তী then()হ্যান্ডলারের মধ্যে দেওয়া হয়। (এই Promise.resolve()এখানে বহিরাগত হয়)।

ফলাফল একই।

আপনি যদি আমাদের এমন একটি উদাহরণ দেখাতে পারেন যা প্রকৃতপক্ষে বিভিন্ন আচরণের প্রদর্শন করে তবে আমরা আপনাকে বলতে পারি যে এটি কেন ঘটছে।


1
চমৎকার উত্তর! Promise.resolve();বনাম সম্পর্কে কি return;?
ফ্যাবিয়ানটি

2
@FabianTe যারা সাথে ব্যতীত একই প্রভাব আছে, হবে undefinedপরিবর্তে "bbb"
JLRishe

51

আপনি ইতিমধ্যে একটি ভাল আনুষ্ঠানিক উত্তর পেয়েছি। আমি অনুভূত আমার একটি সংক্ষিপ্ত যোগ করা উচিত।

প্রতিশ্রুতি / এ + প্রতিশ্রুতিগুলির সাথে নিম্নলিখিত জিনিসগুলি অভিন্ন :

  • কলিং Promise.resolve(আপনার কৌণিক ক্ষেত্রে এটি$q.when )
  • প্রতিশ্রুতিবদ্ধ নির্মাণকারীকে কল করা এবং এর সমাধানকারীকে সমাধান করা। আপনার ক্ষেত্রে এটি new $q
  • একটি thenকলব্যাক থেকে একটি মান ফেরত ।
  • একটি মান সহ একটি অ্যারেতে প্রতিশ্রুতিবদ্ধ all সমস্ত কল করা এবং তারপরে সেই মানটি বের করুন।

সুতরাং নিম্নলিখিতটি সমস্ত প্রতিশ্রুতি বা সমতল মান এক্স এর জন্য একরকম:

Promise.resolve(x);
new Promise(function(resolve, reject){ resolve(x); });
Promise.resolve().then(function(){ return x; });
Promise.all([x]).then(function(arr){ return arr[0]; });

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


আমি জিজ্ঞাসা করতে পারি কি করার মানে Promise.resolve().then(function(){ return x; });? আমি স্নিপড কিছু অনুরূপ কিছু করতে দেখলাম (এটি thenব্লকের অভ্যন্তরে একটি ফাংশন বলে )। আমি ভেবেছিলাম এটি কম-বেশি সময় শেষ করার মতো হয়েছিল তবে এটি কিছুটা দ্রুত। jsben.ch/HIfDo
সাম্পগুন

99.99% ক্ষেত্রে এটি Promise.resolve (x) এর সমান কোনও বক্তব্য নেই। (0.001% হ'ল আমরা withকোনও xসম্পত্তি বা অ্যাক্সেসর সহ প্রক্সির উপর একটি ব্লকে আছি যা ব্যতিক্রম ছুঁড়ে ফেলে। সেই ক্ষেত্রে প্রতিশ্রুতি। রিলিজ (এক্স) একটি নিক্ষিপ্ত ত্রুটির কারণ Promise.resolve().then(function(){ return x; });হতে পারে তবে ত্রুটি নিক্ষিপ্ত হওয়ার পরে প্রত্যাখ্যাত প্রতিশ্রুতি হবে in a then)।
বেনিয়ামিন গ্রুইনবাউম


আপনি একটি খালি ব্লিটজ লিঙ্ক করেছেন, বা আপনি সংরক্ষণ করেন নি। যাইহোক আমি বিবৃতিগুলির মধ্যে পার্থক্য সম্পর্কে কথা বলছিলাম না। আমি যা লিখেছিলাম তা নিয়ে স্পষ্টভাবে কথা বলছিলাম। শুধু আরো স্পষ্ট হবে, এই স্নিপেট আমি যে বিষয়ে কথা হয়েছিল: if (validator) { Promise.resolve().then(() => { this._cdRef.markForCheck(); }); }। এখানে প্রতিশ্রুতি অর্পণ করা হয় নি, তবে এর মানে কী? একটি সময়সীমা একই প্রভাব ফেলবে (কম বা কম), না?
সাম্পগুন

1
সমস্ত সিঙ্ক্রোনাস কোড সংঘটিত হওয়ার পরেও কোনও আই / ও ঘটে যাওয়ার আগে এটি অ্যাসিক্রোনালিকভাবে কলটি সম্পাদন করে। এটিকে "মাইক্রোটিক শব্দার্থবিজ্ঞান" বলা হয়।
বেনিয়ামিন গ্রুইনবাউম

1

পার্থক্যটি হ'ল আপনি যখন করবেন তখন আপনি একটি অপ্রয়োজনীয় প্রতিশ্রুতি তৈরি করছেন return Promise.resolve("bbb")। কোনও onFulfilled()হ্যান্ডলারের কাছ থেকে প্রতিশ্রুতি ফিরিয়ে দেওয়া প্রতিশ্রুতির রেজোলিউশনটিকে সরিয়ে দেয়প্রতিশ্রুতি শৃঙ্খলা কাজ কিভাবে এইভাবে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.