सब:
मैं वादा करने के लिए बहुत नया हूं, बस उत्सुक हूं कि वे कैसे हल हो जाते हैं, एक बात मुझे भ्रमित करती है:
कुछ पोस्ट दिखाते हैं
var defer = $q.defer();
// some logic block
{
// if success doing something
defer.resolve();
}
return defer.promise;
लेकिन यदि उपयोग।
एक और भ्रम है: अगर मैं कुछ जंजीरों का उपयोग करता हूं।तब () फ़ंक्शन, मुझे आश्चर्य है कि उनके बीच क्या संबंध है, क्या वे एक ही वादे वाली वस्तु हैं जो अभी-अभी पारित हुई हैं या प्रत्येक। तब एक नया वादा वस्तु उत्पन्न करेगा और इसे वापस करेगा?
उत्तर:
उत्तर № 1 के लिए 1जैसा कि इस पूरे और स्पष्ट में निर्दिष्ट है दस्तावेज़:
प्रश्न 1। मुझे आश्चर्य है कि अगर यह वादा हल हो गया या नहीं तो मैं कैसे नियंत्रित करूं?
वादा एपीआई में से एक विशेष कार्यों का समर्थन करता है resolve()
या reject()
एक वादा। तो आप अपने कोड में निम्नलिखित कार्यों का उपयोग कर सकते हैं
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});
अस्वीकृति तब होती है जब कोई वादा स्पष्ट रूप से अस्वीकार कर दिया जाता है, लेकिन यह भी निहित है यदि कोई त्रुटि कंस्ट्रक्टर कॉलबैक में डाली जाती है।
var jsonPromise = new Promise(function(resolve, reject) {
// JSON.parse throws an error if you feed it some
// invalid JSON, so this implicitly rejects:
resolve(JSON.parse("This ain"t JSON"));
});
jsonPromise.then(function(data) {
// This never happens:
console.log("It worked!", data);
}).catch(function(err) {
// Instead, this happens:
console.log("It failed!", err);
});
अन्य वेरिएंट में प्रोमिस को रिटर्न वैल्यू के साथ हल किया जाता है जिसे चेन में अगले लिंक पर पास किया जाता है।
प्रश्न 2।
वादे कुछ समझदारी के काम हैंभविष्य में कुछ मूल्य के साथ परिणाम। परिणाम मूल्य वादे से वापसी मूल्य है - इसलिए मूल रूप से वादा करते हैं कि चैनिंग (.then (...)। तब ...) उन कार्यों की श्रृंखला है जो पिछले एक तक इंतजार करेंगे (कुछ मूल्य के साथ समाधान)। फिर उन्हें एक तर्क के साथ बुलाया जाता है जो कतार में अंतिम निष्पादित फ़ंक्शन (श्रृंखला में पिछले लिंक) का रिटर्न मूल्य है।
.then()
एक नया वादा वस्तु लौटाता है इस प्रकार चाइनिंग की अनुमति देता है। (प्रलेखन लिंक के लिए टिप्पणी देखें)
REMARK
में सभी कोणीय वादों का महान और छोटा वर्णन है आधिकारिक दस्तावेज खंड के तहत Promise API
और अगले एक - Chaining the promises
.
उत्तर № 2 के लिए 1
यह "पूर्ण महिमा में वादों को समझाने का प्रयास नहीं है - इसके लिए ब्लॉग हैं। यह आपके विशिष्ट प्रश्नों का उत्तर देने के लिए है:"
Q1:
लेकिन अगर मैं उपयोग करता हूं
.then()
समारोह, वादा से लौटा है.then(function(){})
, मुझे आश्चर्य है कि अगर यह वादा हल हो गया या नहीं तो मैं कैसे नियंत्रित करूं?
संकल्प हैंडलर का कार्य .then
यह वादा कैसे हल किया जाता है:
- यदि हैंडलर फ़ंक्शन एक गैर-वादा मूल्य लौटाता है, तो उस मूल्य के साथ वादा करने का वादा करता है।
var तत्पश्चात = originalPromise.then (फंक्शन सक्सेस () { वापसी "फू"; }; तत्पश्चात। कंसोल.लॉग (डेटा); // "फू" };
- यदि हैंडलर फ़ंक्शन एक और वादा वापस करता है, तो
.then
वादा ठीक से हल करेगा कि नया वादा कैसे हल होगा (या अस्वीकार)
var तत्संबंधी $ समय वापसी (फ़ंक्शन () {वापसी "फू";}, 1000); }; तत्पश्चात। कंसोल.लॉग (डेटा); // (1 सेकंड के बाद) "फू" };
- यदि हैंडलर फ़ंक्शन अपवाद को फेंकता है या यदि रिटर्न स्पष्ट रूप से अस्वीकार किया गया वादा है तो $ q.reject:
var तत्संबंधी = मूलप्रकार।तब (समारोह) { $ q.reject लौटें ("कुछ त्रुटि"); }; तत्पश्चात। कंसोल.लॉग (डेटा); // यहाँ नहीं मिलता है }) .चैच (फ़ंक्शन (इर)) { कंसोल.लॉग (इरेट); // "कुछ त्रुटि" };
Q2:
अगर मैं कुछ जंजीर का उपयोग करता हूं
.then()
कार्य, मुझे आश्चर्य है कि उनके बीच क्या संबंध है, क्या वे एक ही वादे वाली वस्तु हैं जो अभी-अभी पारित हुई हैं या प्रत्येक.then
एक नया वादा वस्तु उत्पन्न करेगा और इसे वापस करेगा?
से प्रत्येक .then
अपना खुद का वादा पैदा करता है।
var timeoutPromise = $ टाइमआउट (afterTimeout, 1000); var thenPromise = timeoutPromise.then (doSomething); var otherThenPromise = timeoutPromise.then (doSomethingElse);
अगर timeoutPromise
हल करता है, फिर दोनों doSomething
तथा doSomethingElse
निष्पादित करेगा और उनके परिणाम पर निर्भर करेगा thenPromise
तथा anotherThenPromise
उनके संबंधित संकल्प होंगे।