প্রকৃতপক্ষে একটি বেশ সমালোচনামূলক পার্থক্য রয়েছে, ইনফোফার হিসাবে jQuery এর ডিফার্ডগুলি প্রতিশ্রুতিগুলির বাস্তবায়ন হতে বোঝায় (এবং jQuery3.0 আসলে এগুলি অনুমানের মধ্যে আনার চেষ্টা করে)।
সম্পন্ন / তার মধ্যে মূল পার্থক্য হ'ল
.done()
আপনি যা করেন বা আপনি কী ফিরিয়ে দেন তা বিবেচনা না করে সর্বদা একই প্রতিশ্রুতি / মোড়ানো মানগুলি ফেরত দেয়।
.then()
সর্বদা একটি নতুন প্রতিশ্রুতি ফেরত দেয় এবং আপনি যে ফাংশনটি এটি পাস করেছিলেন তার ভিত্তিতে সেই প্রতিশ্রুতি কী তা নিয়ন্ত্রণ করার দায়িত্বে আছেন।
নেটিভ ES2015 প্রতিশ্রুতিগুলিতে jQuery থেকে অনুবাদ, .done()
এটি প্রতিশ্রুতি চেইনের কোনও ফাংশনকে ঘিরে "ট্যাপ" কাঠামো বাস্তবায়নের মতো, এটি যদি শৃঙ্খলা "সমাধান" অবস্থায় থাকে তবে কোনও ক্রিয়াকলাপের মান প্রদান করবে .. ... তবে সেই ফাংশনের ফলাফল চেইনে নিজেই প্রভাব ফেলবে না।
const doneWrap = fn => x => { fn(x); return x };
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(doneWrap(console.log.bind(console)));
$.Deferred().resolve(5)
.done(x => x + 1)
.done(console.log.bind(console));
যারা উভয় লগ 5 হবে, 6 না।
নোট করুন যে আমি লগিং করতে করানো এবং সম্পন্ন র্যাপ ব্যবহার করেছি, তা নয়। এটি কারণ কনসোল.লগ ফাংশনগুলি আসলে কিছুই ফেরায় না। এবং আপনি যদি পাস করেন তবে কি হয়? এমন কোনও ফাংশন যা কিছু ফেরত না?
Promise.resolve(5)
.then(doneWrap( x => x + 1))
.then(console.log.bind(console))
.then(console.log.bind(console));
এটি লগ হবে:
5
অনির্দিষ্ট
কি হলো? যখন আমি এটি ব্যবহার করি এবং এটি কোনও ফাংশন পাস করে যা কোনও কিছুই ফেরত না, তার অন্তর্নিহিত ফলাফলটি ছিল "অপরিজ্ঞাত" ... যা অবশ্যই পরবর্তীতে পদ্ধতিতে একটি প্রতিশ্রুতি [অপরিজ্ঞাত] ফিরিয়েছিল, যা অপরিজ্ঞাত ছিল logged সুতরাং আমরা যে মূল মানটি দিয়ে শুরু করেছি তা মূলত হেরে গেছে।
.then()
এটি, হৃদয়ে, ফাংশন রচনাগুলির একটি রূপ: প্রতিটি পদক্ষেপের ফলাফলটি পরবর্তী পদক্ষেপে ফাংশনের আর্গুমেন্ট হিসাবে ব্যবহৃত হয়। এই কারণেই .ডোনটিকে "ট্যাপ" হিসাবে সবচেয়ে ভালভাবে ভাবা হয় -> এটি আসলে রচনার অংশ নয়, এটি এমন কিছু যা একটি নির্দিষ্ট ধাপে মানটির দিকে নজর রাখে এবং সেই মানটিতে একটি ক্রিয়াকলাপ চালায় তবে বাস্তবে পরিবর্তন হয় না কোনওভাবেই রচনা।
এটি একটি চমত্কার মৌলিক পার্থক্য, এবং দেশীয় প্রতিশ্রুতিগুলির একটি .ডোন পদ্ধতি তাদের প্রয়োগ না করার সম্ভবত একটি ভাল কারণ রয়েছে। কেন আমাদের .fail পদ্ধতি নেই সেদিকে toুকতে হবে না, কারণ এটি আরও জটিল (যেমন, .fail / .catch .done / .then -> ফাংশনগুলির আয়না নয়। "থাকুন" যেমন পাস করা হয়েছে তাদের মতো প্রত্যাখ্যাত হয়েছে then