প্রতিশ্রুতিগুলির রাষ্ট্র থাকে, এগুলি মুলতুবি হিসাবে শুরু হয় এবং এগুলি নিষ্পত্তি করতে পারে:
- পরিপূর্ণ অর্থ যে গণনাটি সফলভাবে শেষ হয়েছে।
- প্রত্যাখাত অর্থ যে গণনা ব্যর্থ হয়েছে।
প্রতিশ্রুতি ফেরানোর ফাংশনগুলি কখনই ছুঁড়ে ফেলা উচিত নয় , পরিবর্তে তাদের প্রত্যাখ্যানগুলি ফিরিয়ে দেওয়া উচিত। প্রতিশ্রুতি ফেরত ফাংশন থেকে ছুড়ে ফেলা আপনাকে a } catch {
এবং a উভয়ই ব্যবহার করতে বাধ্য করবে .catch
। প্রতিশ্রুত এপিআই ব্যবহার করা লোকেরা প্রতিশ্রুতি নিক্ষেপ করার আশা করে না। আপনি যদি নিশ্চিত না হন যে async এপিআই কীভাবে জেএসে কাজ করে - দয়া করে এই উত্তরটি দেখুন প্রথমে ।
1. ডোম লোড বা অন্য এক সময় ইভেন্ট:
সুতরাং, প্রতিশ্রুতি তৈরির অর্থ সাধারণত তারা কখন সেটেল হয় তা নির্দিষ্ট করে দেওয়া হয় - এর অর্থ যখন তারা ডেটা উপলব্ধ থাকে তা নির্দেশ করতে পূর্ণ বা প্রত্যাখ্যানিত পর্যায়ে চলে যায় (এবং এর সাথে অ্যাক্সেস করা যায়) .then
)।
Promise
দেশীয় ES6 প্রতিশ্রুতির মতো নির্মাতাকে সমর্থন করে এমন আধুনিক প্রতিশ্রুতি বাস্তবায়ন সহ :
function load() {
return new Promise(function(resolve, reject) {
window.onload = resolve;
});
}
তারপরে আপনি ফলাফলটির প্রতিশ্রুতিটি এর মতো ব্যবহার করবেন:
load().then(function() {
// Do things after onload
});
মুলতুবি সমর্থনকারী লাইব্রেরিগুলির সাথে (আসুন এখানে উদাহরণের জন্য $ q ব্যবহার করুন, তবে আমরা পরে jQueryও ব্যবহার করব):
function load() {
var d = $q.defer();
window.onload = function() { d.resolve(); };
return d.promise;
}
বা এপিআই এর মতো জিকুয়ের সাথে একবারে ঘটে যাওয়া ইভেন্টের প্রতি ঝুঁকুন:
function done() {
var d = $.Deferred();
$("#myObject").once("click",function() {
d.resolve();
});
return d.promise();
}
2. সাধারণ কলব্যাক:
এই এপিআইগুলি ভাল কারণ সাধারণ… কলব্যাকগুলি জেএসে সাধারণ। থাকার সাধারণ ক্ষেত্রে যাক চেহারা onSuccess
এবং onFail
:
function getUserData(userId, onLoad, onFail) { …
Promise
দেশীয় ES6 প্রতিশ্রুতির মতো নির্মাতাকে সমর্থন করে এমন আধুনিক প্রতিশ্রুতি বাস্তবায়ন সহ :
function getUserDataAsync(userId) {
return new Promise(function(resolve, reject) {
getUserData(userId, resolve, reject);
});
}
মুলতুবি সমর্থনকারী লাইব্রেরিগুলির সাথে (আসুন এখানে উদাহরণের জন্য jQuery ব্যবহার করুন, তবে আমরা উপরে $ q ব্যবহার করেছি):
function getUserDataAsync(userId) {
var d = $.Deferred();
getUserData(userId, function(res){ d.resolve(res); }, function(err){ d.reject(err); });
return d.promise();
}
jQuery এছাড়াও একটি $.Deferred(fn)
ফর্ম প্রস্তাব করে , যা আমাদের এমন একটি এক্সপ্রেশন লিখতে অনুমতি দেয় যা ফর্মটি খুব কাছাকাছি অনুকরণ new Promise(fn)
করে:
function getUserDataAsync(userId) {
return $.Deferred(function(dfrd) {
getUserData(userId, dfrd.resolve, dfrd.reject);
}).promise();
}
দ্রষ্টব্য: এখানে আমরা jQuery স্থগিত resolve
এবং reject
পদ্ধতিগুলি "বিচ্ছিন্ন"; এই সত্যটি কাজে লাগিয়েছি ; অর্থাত। তারা উদাহরণ হতে বাধ্য jQuery.Deferred () । সমস্ত libs এই বৈশিষ্ট্যটি সরবরাহ করে না।
৩. নোড স্টাইলের কলব্যাক ("নোডব্যাক"):
নোড স্টাইলের কলব্যাকস (নোডব্যাকস) এর একটি নির্দিষ্ট ফর্ম্যাট রয়েছে যেখানে কলব্যাকগুলি সর্বদা সর্বশেষ যুক্তি হিসাবে থাকে এবং এর প্রথম পরামিতিটি একটি ত্রুটি। আসুন প্রথমে ম্যানুয়ালি একটির প্রতিশ্রুতি দেওয়া যাক:
getStuff("dataParam", function(err, data) { …
প্রতি:
function getStuffAsync(param) {
return new Promise(function(resolve, reject) {
getStuff(param, function(err, data) {
if (err !== null) reject(err);
else resolve(data);
});
});
}
মুলতুবি দিয়ে আপনি নিম্নলিখিতটি করতে পারেন (আসুন Q উদাহরণস্বরূপ ব্যবহার করুন, যদিও Q এখন নতুন সিনট্যাক্সকে সমর্থন করে যা আপনার পছন্দ করা উচিত ):
function getStuffAsync(param) {
var d = Q.defer();
getStuff(param, function(err, data) {
if (err !== null) d.reject(err);
else d.resolve(data);
});
return d.promise;
}
সাধারণভাবে, আপনাকে জিনিসগুলিকে ম্যানুয়ালি খুব বেশি প্রচার করা উচিত নয়, নোড 8+-এ নোড 8 এর সাথে স্থানীয় প্রতিশ্রুতিগুলি যেমন নোডের সাথে ডিজাইন করা হয়েছিল এমন বেশিরভাগ প্রতিশ্রুতি গ্রন্থাগারগুলির নোডব্যাকগুলি প্রতিশ্রুতি দেওয়ার জন্য একটি বিল্ট ইন পদ্ধতি রয়েছে। উদাহরণ স্বরূপ
var getStuffAsync = Promise.promisify(getStuff); // Bluebird
var getStuffAsync = Q.denodeify(getStuff); // Q
var getStuffAsync = util.promisify(getStuff); // Native promises, node only
4. নোড স্টাইল কলব্যাক্স সহ একটি সম্পূর্ণ গ্রন্থাগার:
এখানে কোনও সুবর্ণ নিয়ম নেই, আপনি একে একে প্রতিশ্রুতি দিন। যাইহোক, কিছু প্রতিশ্রুতি বাস্তবায়ন আপনাকে বাল্কে এটি করার অনুমতি দেয়, উদাহরণস্বরূপ ব্লুবার্ডে, নোডব্যাক এপিআইকে একটি প্রতিশ্রুতি এপিআইতে রূপান্তর করা তত সহজ:
Promise.promisifyAll(API);
অথবা সঙ্গে নেটিভ প্রতিশ্রুতি মধ্যে নোড :
const { promisify } = require('util');
const promiseAPI = Object.entries(API).map(([key, v]) => ({key, fn: promisify(v)}))
.reduce((o, p) => Object.assign(o, {[p.key]: p.fn}), {});
মন্তব্য:
- অবশ্যই, আপনি যখন কোনও
.then
হ্যান্ডলারের সাথে থাকবেন তখন আপনাকে জিনিসগুলি প্রচার করার দরকার নেই। কোনও .then
হ্যান্ডলারের কাছ থেকে কোনও প্রতিশ্রুতি ফিরিয়ে দেওয়া সেই প্রতিশ্রুতির মান সহ সমাধান বা প্রত্যাখ্যান করবে। নিক্ষেপ করা ক.then
হ্যান্ডলারের করাও ভাল অনুশীলন এবং প্রতিশ্রুতি প্রত্যাখ্যান করবে - এটি বিখ্যাত প্রতিশ্রুতি থ্রো নিরাপত্তা।
- প্রকৃত
onload
ক্ষেত্রে, আপনার addEventListener
পরিবর্তে ব্যবহার করা উচিত onX
।