वादा हमेशा लंबित रहेगा, जब तक कि उसके परिणाम अभी तक हल नहीं हुए हैं। आपको .thenवादे की स्थिति की परवाह किए बिना परिणामों को पकड़ने के वादे पर कॉल करना चाहिए (हल या अभी भी लंबित):
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }
userToken.then(function(result) {
console.log(result) // "Some User token"
})
ऐसा क्यों है?
वादे ही आगे की दिशा होते हैं; आप केवल एक बार उन्हें हल कर सकते हैं। किसी का हल किया गया मान Promiseउसके .thenया .catchविधियों के लिए दिया गया है ।
विवरण
वादे के अनुसार / A + युक्ति:
वादा समाधान प्रक्रिया एक अमूर्त ऑपरेशन है जो एक वादा और एक मूल्य के रूप में लिया जाता है, जिसे हम [[संकल्प]] (वादा, x) के रूप में दर्शाते हैं। यदि x एक ज्वलनशील है, तो यह वादा करता है कि x की अवस्था को अपनाने का वादा किया गया है, इस धारणा के तहत कि x कम से कम कुछ वादे की तरह व्यवहार करता है। अन्यथा, यह मान x के साथ वादा पूरा करता है।
तबेबल्स का यह उपचार तब तक वादे के कार्यान्वयन को बाधित करने की अनुमति देता है, जब तक कि वे एक वादा / ए + -कंप्लींटेंट विधि का खुलासा नहीं करते हैं। यह वादा करता है / ए + कार्यान्वयन के लिए उचित तो तरीकों के साथ गैर-अनुरूप कार्यान्वयन को "आत्मसात" करने की अनुमति देता है।
यह युक्ति पार्स करने के लिए थोड़ा कठिन है, तो चलो इसे तोड़ दें। नियम है:
यदि .thenहैंडलर में फ़ंक्शन एक मान लौटाता है, तो Promiseउस मान के साथ हल होता है। यदि हैंडलर दूसरा लौटाता है Promise, तो मूल Promiseजंजीर के हल मूल्य के साथ हल होता है Promise। अगले .thenहैंडलर में हमेशा पूर्ववर्ती में लौटाए गए जंजीर वाले वादे का सुलझा हुआ मूल्य होगा .then।
जिस तरह से यह वास्तव में काम करता है वह नीचे और अधिक विवरण में वर्णित है:
1. .thenसमारोह की वापसी वादे का हल मूल्य होगा।
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return "normalReturn";
})
.then(function(result) {
console.log(result); // "normalReturn"
});
2. यदि .thenफ़ंक्शन एक लौटता है Promise, तो उस जंजीर वादे का हल किया गया मूल्य निम्नलिखित को पारित किया जाता है .then।
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("secondPromise");
}, 1000)
})
})
.then(function(result) {
console.log(result); // "secondPromise"
});