ডিফার্ড, প্রতিশ্রুতি এবং ফিউচারের মধ্যে পার্থক্য কী?
এই তিনটির পিছনে কি কোনও অনুমোদিত তত্ত্ব আছে?
ডিফার্ড, প্রতিশ্রুতি এবং ফিউচারের মধ্যে পার্থক্য কী?
এই তিনটির পিছনে কি কোনও অনুমোদিত তত্ত্ব আছে?
উত্তর:
আমি কীভাবে ওপি-র প্রশ্নের উত্তর দেওয়ার চেষ্টা করেছি তার জন্য আপাত অপছন্দের আলোকে। আক্ষরিক উত্তর হ'ল, একটি প্রতিশ্রুতি হ'ল শেয়ার্ড ডাব্লু / অন্যান্য বিষয়বস্তু, অন্যদিকে পিছিয়ে রাখা ব্যক্তিগত রাখতে হবে। প্রাথমিকভাবে, একটি বিলম্বিত (যা সাধারণত প্রতিশ্রুতি প্রসারিত হয়) নিজেই সমাধান করতে পারে, যখন কোনও প্রতিশ্রুতি এটি করতে সক্ষম নাও হতে পারে।
আপনি যদি মিনিটটিতে আগ্রহী হন, তবে প্রতিশ্রুতি / এ + পরীক্ষা করুন ।
আমি যতদূর অবগত আছি, সর্বাধিক উদ্দেশ্য হ'ল একটি স্ট্যান্ডার্ডাইজড ইন্টারফেসের মাধ্যমে স্বচ্ছতা এবং সংযোগকে আলগা করা। @ Jender00 এর প্রস্তাবিত পড়া দেখুন :
ফাংশনগুলিতে সরাসরি কলব্যাকগুলি পাস করার পরিবর্তে, এমন কিছু যা প্রতিশ্রুতি ব্যবহার করে দৃly়ভাবে সংযুক্ত ইন্টারফেসের দিকে পরিচালিত করতে পারে সে কোডের জন্য উদ্বেগগুলি পৃথক করতে দেয় যা সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস।
ব্যক্তিগতভাবে, আমি উদাহরণস্বরূপ দরকারী হিসাবে টেমপ্লেটগুলি অ্যাসিঙ্ক্রোনাস অনুরোধ দ্বারা জনিত যা স্ক্রিপ্টগুলি নির্ভরশীলতার নেটওয়ার্কগুলি লোড করে এবং একটি ব্লকিং পদ্ধতিতে ডেটা গঠনের জন্য ব্যবহারকারীদের প্রতিক্রিয়া সরবরাহ করে তার সাথে সম্পর্কিত হয়েছি।
প্রকৃতপক্ষে, জেএস মোডে কোডমিরার লোড করার পরে কিছু করার খাঁটি কলব্যাক ফর্মটি তুলনা করুন সংক্ষেপে (দুঃখিত, আমি কিছুক্ষণের জন্য jQuery ব্যবহার করিনি ):
/* assume getScript has signature like: function (path, callback, context)
and listens to onload && onreadystatechange */
$(function () {
getScript('path/to/CodeMirror', getJSMode);
// onreadystate is not reliable for callback args.
function getJSMode() {
getScript('path/to/CodeMirror/mode/javascript/javascript.js',
ourAwesomeScript);
};
function ourAwesomeScript() {
console.log("CodeMirror is awesome, but I'm too impatient.");
};
});
প্রতিশ্রুতি রচনা সংস্করণে (আবারও, ক্ষমাপ্রার্থী, আমি jQuery এ আপ টু ডেট নেই):
/* Assume getScript returns a promise object */
$(function () {
$.when(
getScript('path/to/CodeMirror'),
getScript('path/to/CodeMirror/mode/javascript/javascript.js')
).then(function () {
console.log("CodeMirror is awesome, but I'm too impatient.");
});
});
আধা ছদ্ম কোডের জন্য ক্ষমা চাইছি, তবে আমি আশা করি এটি মূল ধারণাটি কিছুটা পরিষ্কার করে দিয়েছে। মূলত, একটি মানসম্মত প্রতিশ্রুতি ফিরিয়ে দিয়ে আপনি এই প্রতিশ্রুতিটি পাশ করতে পারেন, যাতে আরও স্পষ্ট দলবদ্ধকরণের অনুমতি দেওয়া হয়।
fn(callback, errback)
চেয়ে শক্তভাবে মিলিত বা কম কার্যকর fn().then(callback, errback)
নয় - তবে যেভাবেই প্রতিশ্রুতি ব্যবহার করা এটি একটি ভুল উপায়। আমি বিশেষত কার্গো কাল্ট $.when
উদাহরণটিকে ঘৃণা করি - $.when
কলব্যাকের সাথে কাজ করে এমন কোনও ফাংশন আপনার থাকতে পারে না এমন কোনও কারণ নেই ।
নির্বাচিত উত্তর সহ এই উত্তর, ধারণার দিক থেকে প্রতিশ্রুতি উপস্থাপক কিন্তু সুনির্দিষ্ট উদাসীন ঠিক পার্থক্য পরিভাষা যে যখন তাদের বাস্তবায়ন (এবং সেখানে লাইব্রেরি ব্যবহার দেখা দেয় দুটো কারণে হয় জন্য ভাল হয় গুরুত্বপূর্ণ পার্থক্য)।
যেহেতু এটি এখনও একটি বিবর্তিত অনুমান , তাই উত্তরটি বর্তমানে উইকিপিডিয়া (যেমন উইকিপিডিয়া ) এবং বাস্তবায়ন ( jQuery এর মতো) উভয় জরিপ করার চেষ্টা থেকে আসে :
বিলম্বিত : জনপ্রিয় রেফারেন্স বর্ণিত কখনও,
1 2 3 4
প্রতিশ্রুতি রেজোলিউশন (বাস্তবায়নের সালিশ হিসেবে নয় বরং সাধারণভাবে ব্যবহৃত বাস্তবায়নের দ্বারা এবং )।
5 6 7
resolve
reject
কখনও কখনও স্থগিতগুলি প্রতিশ্রুতিও দেওয়া হয় (বাস্তবায়ন করা হয় then
),
5 6 6
বার এটি আরও বিশুদ্ধ হিসাবে দেখা যায় যে ডিফারড কেবলমাত্র রেজোলিউশনে সক্ষম হয় এবং ব্যবহারকারীর ব্যবহারের প্রতিশ্রুতি অ্যাক্সেস করতে বাধ্য করে ।
7
then
প্রতিশ্রুতি : আলোচনার অধীনে কৌশলের জন্য সর্বাধিক অন্তর্ভুক্ত শব্দ।
একটি প্রক্সি অবজেক্ট কোনও টার্গেট ফাংশনের ফলাফল সংরক্ষণ করে যার সমকালীনতাটিকে আমরা বিমূর্ত করতে চাই এবং আরও একটি then
লক্ষ্য ফাংশন গ্রহণ করে একটি ফাংশন প্রকাশ করে এবং একটি নতুন প্রতিশ্রুতি ফিরিয়ে দেয়।
2
সাধারণ জেএস থেকে উদাহরণ :
> asyncComputeTheAnswerToEverything()
.then(addTwo)
.then(printResult);
44
সর্বদা জনপ্রিয় রেফারেন্সে বর্ণিত, যদিও এর দায়বদ্ধতার রেজোলিউশনটি কখনই আসে তার বিষয়ে নির্দিষ্ট করে দেওয়া হয়নি। 1 2 3 4
সর্বদা জনপ্রিয় বাস্তবায়নে উপস্থিত থাকে এবং কখনও রেজোলিউশন দেয় না। 5 6 7
ভবিষ্যত : কিছু জনপ্রিয় রেফারেন্স 1 এবং কমপক্ষে একটি জনপ্রিয় বাস্তবায়নের মধ্যে একটি আপাতদৃষ্টিতে অবমূল্যায়িত শব্দটি পাওয়া গেছে , 8 তবে 'প্রতিশ্রুতি' 3 শব্দটির পক্ষে অগ্রাধিকার হিসাবে আলোচনার মধ্য দিয়ে পর্যায়ক্রমে আলোচনা করা হচ্ছে এবং বিষয়টির জনপ্রিয় পরিচিতিতে সর্বদা উল্লেখ করা হয়নি mentioned 9
তবে কমপক্ষে একটি লাইব্রেরি সিঙ্ক্রোনসিটি এবং ত্রুটি পরিচালনার জন্য বিমূর্তভাবে শব্দটি ব্যবহার করে, then
কার্যকারিতা
সরবরাহ না করে not 10
'প্রতিশ্রুতি' শব্দটি এড়ানো উদ্দেশ্যমূলক ছিল কিনা তা স্পষ্ট নয়, তবে আশেপাশে প্রতিশ্রুতি নির্মিত হওয়ার পরে সম্ভবত একটি ভাল পছন্দ 'তাত্পর্যযোগ্য'।
2
প্রতিশ্রুতি / এ এবং প্রতিশ্রুতি / এ + এর মধ্যে পার্থক্য
(টিএল; ডিআর, প্রতিশ্রুতি / এ + বেশিরভাগ প্রতিশ্রুতি / এ-তে অস্পষ্টতাগুলি সমাধান করে)
Task
আমার পক্ষে সত্যই এটি কীভাবে ক্লিক করেছে তা হ'ল ডোমেনিক ডেনিকোলা এই উপস্থাপনা ।
একটি GitHub সারকথা , তিনি দিলেন সবচেয়ে ভালো বর্ণনা আমি, এটা খুবই সংক্ষিপ্ত আছে:
প্রতিশ্রুতির বিষয়টি হ'ল আমাদেরকে অ্যাসিঙ্ক বিশ্বে কার্যকরী রচনা এবং ত্রুটি বুদবুদ ফিরে দেওয়া।
অন্য কথায়, প্রতিশ্রুতিগুলি এমন একটি উপায় যা আমাদের অ্যাসিনক্রোনাস কোড লিখতে দেয় যা প্রায় সমানভাবে লিখতে হয় যেমন এটি সিঙ্ক্রোনাস ।
প্রতিশ্রুতি সহ এই উদাহরণটি বিবেচনা করুন:
getTweetsFor("domenic") // promise-returning async function
.then(function (tweets) {
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
return expandUrlUsingTwitterApi(mostRecentShortUrl); // promise-returning async function
})
.then(doHttpRequest) // promise-returning async function
.then(
function (responseBody) {
console.log("Most recent link text:", responseBody);
},
function (error) {
console.error("Error with the twitterverse:", error);
}
);
এটি এমনভাবে কাজ করে যে আপনি এই সিঙ্ক্রোনাস কোডটি লিখেছেন:
try {
var tweets = getTweetsFor("domenic"); // blocking
var shortUrls = parseTweetsForUrls(tweets);
var mostRecentShortUrl = shortUrls[0];
var responseBody = doHttpRequest(expandUrlUsingTwitterApi(mostRecentShortUrl)); // blocking x 2
console.log("Most recent link text:", responseBody);
} catch (error) {
console.error("Error with the twitterverse: ", error);
}
(এটি যদি এখনও জটিল মনে হয় তবে উপস্থাপনাটি দেখুন!)
স্থগিত সম্পর্কিত, এটি উপায় .resolve()
বা .reject()
প্রতিশ্রুতি। ইন অঙ্গীকার / বি বৈশিষ্ট, এটা বলা হয় .defer()
। JQuery এ, এটি $.Deferred()
।
দয়া করে নোট করুন, যতদূর আমি জানি, jQuery এর প্রতিশ্রুতি বাস্তবায়ন নষ্ট হয়েছে (কমেন্ট দেখুন), কমপক্ষে jQuery 1.8.2 হিসাবে।
এটি অনুমান করা হয় প্রতিশ্রুতি / A এর পরে সক্ষম করে তবে আপনি "তত্ক্ষণাত চেষ্টা / ধরা" কার্যকারিতাটি কাজ করবে না এমন অর্থে আপনার সঠিক ত্রুটিটি পরিচালনা করতে হবে না। কোনটি দুঃখের বিষয়, কারণ অ্যাসিঙ্ক কোড সহ "চেষ্টা / ধরা" থাকা সম্পূর্ণ দুর্দান্ত cool
আপনি যদি প্রতিশ্রুতি ব্যবহার করতে চলেছেন (আপনার নিজের কোড দিয়ে এগুলি ব্যবহার করে দেখানো উচিত!), ক্রিস কোওয়ালের কিউ ব্যবহার করুন । JQuery সংস্করণটি ক্লিনার jQuery কোড লেখার জন্য কেবল কিছু কলব্যাক এগ্রিগেটর তবে পয়েন্টটি মিস করে।
ফিউচার সম্পর্কিত, আমার কোনও ধারণা নেই, আমি কোনও এপিআইতে দেখিনি।
সম্পাদনা করুন: নীচে @ ফার্মের মন্তব্য থেকে প্রতিশ্রুতি সম্পর্কে ডোমেনিক ডেনিকোলার ইউটিউব আলাপ ।
ভিডিও থেকে মাইকেল জ্যাকসনের একটি উদ্ধৃতি (হ্যাঁ, মাইকেল জ্যাকসন ):
আমি চাই আপনি এই বাক্যাংশটি মনে মনে জ্বালিয়ে দিন: একটি প্রতিশ্রুতি একটি অ্যাসিনক্রোনাস মান ।
এটি একটি দুর্দান্ত বিবরণ: একটি প্রতিশ্রুতি ভবিষ্যতের পরিবর্তনের মতো - কোনও কোনও ক্ষেত্রে প্রথম শ্রেণির রেফারেন্স যা কোনও কোনও সময়ে উপস্থিত থাকে (বা ঘটবে)।
একটি প্রতিশ্রুতি যখন প্রতিশ্রুতি তৈরি করা হয় একটি মান জন্য একটি প্রক্সি অগত্যা পরিচিত প্রতিনিধিত্ব করে। এটি আপনাকে হিন্ডারগুলিকে একটি অ্যাসিনক্রোনাস অ্যাকশনের চূড়ান্ত সাফল্যের মান বা ব্যর্থতার কারণে সংযুক্ত করতে দেয়। এটি সিঙ্ক্রোনাস পদ্ধতির মতো অ্যাসিনক্রোনাস পদ্ধতিগুলিকে মানগুলি ফিরিয়ে দিতে দেয়: চূড়ান্ত মানের পরিবর্তে, অ্যাসিনক্রোনাস পদ্ধতিটি ভবিষ্যতে কোনও সময়ে একটি মান থাকার প্রতিশ্রুতি দেয়।
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
deferred.promise()
পদ্ধতি একটি অ্যাসিঙ্ক্রোনাস ফাংশন উন্নতি বা তার অভ্যন্তরীণ অনুরোধের স্থিতি হস্তক্ষেপ থেকে অন্য কোড প্রতিরোধ করতে পারবেন। প্রতিশ্রুতি অতিরিক্ত হ্যান্ডলার সংযুক্ত করতে বা রাষ্ট্র নির্ধারণের জন্য প্রয়োজনীয় স্থগিত পদ্ধতিগুলি উন্মুক্ত করে ( তবে তা করা, ব্যর্থ, সর্বদা, পাইপ, অগ্রগতি, রাষ্ট্র এবং প্রতিশ্রুতি ), তবে রাষ্ট্র পরিবর্তন করে না ( সমাধান, প্রত্যাখ্যান, বিজ্ঞপ্তি, সমাধানসহ), প্রত্যাখাত করুন, এবং বিজ্ঞপ্তি সহ )।
যদি লক্ষ্য সরবরাহ করা হয়, deferred.promise()
তবে এর সাথে পদ্ধতিগুলি সংযুক্ত করে তারপরে একটি নতুন তৈরি করার পরিবর্তে এই বস্তুটি ফিরিয়ে দেবে। ইতিমধ্যে বিদ্যমান একটি বস্তুর সাথে প্রতিশ্রুতিমূলক আচরণ সংযুক্ত করতে এটি কার্যকর হতে পারে।
যদি আপনি একটি স্থগিত তৈরি করে থাকেন তবে মুলতুবিতে একটি রেফারেন্স রাখুন যাতে এটি কোনও সময়ে সমাধান বা বাতিল হতে পারে। ডিফার্ড.প্রোমাইজ () এর মাধ্যমে কেবল প্রতিশ্রুতি বস্তুটি ফেরত দিন যাতে অন্য কোড কলব্যাকগুলি নিবন্ধন করতে পারে বা বর্তমান অবস্থাটি পরীক্ষা করতে পারে।
কেবলমাত্র আমরা বলতে পারি যে একটি প্রতিশ্রুতি এমন একটি মান উপস্থাপন করে যা এখনও অবধি জানা যায়নি যেখানে একটি ডিফার্ড হিসাবে এখনও কাজ শেষ হয় না যা এখনও শেষ হয়নি।
promise
এমন একটি মান উপস্থাপন করে যা এখনও জানা যায় নি deferred
এমন কাজ প্রতিনিধিত্ব করে যা এখনও শেষ হয়নিএকটি প্রতিশ্রুতি একটি ফলাফলের জন্য স্থানধারক যা প্রাথমিকভাবে অজানা যখন একটি পিছিয়ে দেওয়া সেই গণনার প্রতিনিধিত্ব করে যা মানটির ফলাফল দেয়।
উল্লেখ