वादों में राज्य होता है, वे लंबित के रूप में शुरू होते हैं और इसके लिए व्यवस्थित हो सकते हैं:
- पूरा जिसका अर्थ है कि गणना सफलतापूर्वक पूर्ण हुआ।
- अस्वीकार कर दिया कि अभिकलन विफल हो गया।
वादा वापसी कार्यों को कभी नहीं फेंकना चाहिए, उन्हें बदले में अस्वीकार करना चाहिए। एक वादा वापसी समारोह से फेंकना आपको दोनों का उपयोग करने के लिए मजबूर करेगा} catch {
और ए.catch
। प्रॉमिस किए गए एपीआई का उपयोग करने वाले लोग वादों को फेंकने की उम्मीद नहीं करते हैं। यदि आप सुनिश्चित नहीं हैं कि JS में async API कैसे काम करती है - तो कृपया इस उत्तर को पहले देखें।
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;
}
या एपीआई जैसे jQuery के साथ, एक बार होने वाली घटना पर हुक करना:
function done() {
var d = $.Deferred();
$("#myObject").once("click",function() {
d.resolve();
});
return d.promise();
}
2. सादा कॉलबैक:
ये API अच्छी तरह से सामान्य हैं ... जेएस में कॉलबैक सामान्य हैं। आइए देखते हैं कि आम मामला क्या है 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 () के उदाहरण के लिए बाध्य हैं । सभी कर्मचारी इस सुविधा की पेशकश नहीं करते हैं।
3. नोड शैली कॉलबैक ("नोडबैक"):
नोड शैली कॉलबैक (नोडबैक) का एक विशेष प्रारूप है जहां कॉलबैक हमेशा अंतिम तर्क होता है और इसका पहला पैरामीटर एक त्रुटि है। आइए पहले एक मैन्युअल रूप से प्रचारित करें:
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 + में मूल वादों को ध्यान में रखते हुए डिजाइन किए गए थे, में नोडबैक को बढ़ावा देने के लिए एक अंतर्निहित विधि है। उदाहरण के लिए
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
।