पर उत्तीर्ण नहीं होने का वादा किया गया है मुझे एक समस्या है कि एक वादे श्रृंखला के माध्यम से रिजेक्शन क्यों पारित नहीं किए जाते हैं और मुझे उम्मीद है कि कोई मुझे समझने में मदद करने में सक्षम होगा। मेरे लिए, वादे की एक श्रृंखला के लिए कार्यक्षमता को जोड़ना एक इरादा है जिसका अर्थ है कि मैं पूरा होने के मूल वचन के आधार पर हूं। व्याख्या करना मुश्किल है, इसलिए मुझे पहले अपनी समस्या का कोड उदाहरण दिखाएं। (नोट:। इस उदाहरण नोड और आस्थगित नोड मॉड्यूल उपयोग कर रहा है मैं डोजो 1.8.3 के साथ इस परीक्षण किया है और एक ही परिणाम था)अस्वीकार किए गए वादे
var d = require("deferred");
var d1 = d();
var promise1 = d1.promise.then(
function(wins) { console.log('promise1 resolved'); return wins;},
function(err) { console.log('promise1 rejected'); return err;});
var promise2 = promise1.then(
function(wins) { console.log('promise2 resolved'); return wins;},
function(err) { console.log('promise2 rejected'); return err;});
var promise3 = promise2.then(
function(wins) { console.log('promise3 resolved'); return wins;},
function(err) { console.log('promise3 rejected'); return err;});
d1.reject(new Error());
इस आपरेशन चलाने के परिणामों
इस उत्पादन है:
promise1 rejected
promise2 resolved
promise3 resolved
ठीक है, मेरे लिए, यह परिणाम समझ में नहीं आता है। इस वादे श्रृंखला को जोड़कर, प्रत्येक व्यक्ति इस इरादे को लागू कर रहा है कि यह डी 1 के सफल समाधान पर निर्भर करेगा और परिणामस्वरूप श्रृंखला को पारित किया जा रहा है। अगर वादे 1 में वादा जीत मान प्राप्त नहीं करता है, लेकिन इसके बजाय इसके त्रुटि हैंडलर में एक त्रुटि मान हो जाता है, तो श्रृंखला में अगले वादे के लिए सफलता का कार्य कहां संभव है? अगले वादे के लिए सार्थक मूल्य पर कोई रास्ता नहीं हो सकता है क्योंकि इसे मूल्य नहीं मिला है।
मैं जो सोच रहा हूं उसका वर्णन करने का एक अलग तरीका यह है: तीन लोग, जॉन, अदरक और बॉब हैं। जॉन एक विजेट की दुकान का मालिक है। अदरक अपनी दुकान में आता है और मिश्रित रंगों के विगेट्स के बैग का अनुरोध करता है। उनके पास स्टॉक में नहीं है, इसलिए वह उन्हें वितरित करने के लिए अपने वितरक से अनुरोध भेजता है। इस बीच, वह अदरक को बारिश की जांच देता है जिसमें कहा गया है कि उसे विजेट के बैग का बकाया है। बॉब को पता चला कि अदरक को विजेट मिल रहा है और अनुरोध है कि जब वह उनके साथ हो तो नीली विजेट प्राप्त करेगी। वह सहमत है और उसे एक नोट बताती है कि वह करेगी। अब, जॉन के वितरक को उनकी आपूर्ति में कोई विजेट नहीं मिल रहा है और निर्माता उन्हें और अधिक नहीं बनाता है, इसलिए वे जॉन को सूचित करते हैं, जो बदले में अदरक को सूचित करता है कि वह विजेट नहीं प्राप्त कर सकती है। बॉब को अदरक से नीला विजेट कैसे प्राप्त हो सकता है जब खुद को नहीं मिला?
इस मुद्दे पर मेरे पास तीसरा और यथार्थवादी परिप्रेक्ष्य है। मान लें कि मेरे पास दो मान हैं जिन्हें मैं डेटाबेस में अपडेट करना चाहता हूं। एक दूसरे की आईडी पर निर्भर है, लेकिन मैं तब तक आईडी नहीं प्राप्त कर सकता जब तक कि मैंने इसे पहले ही डेटाबेस में डाला नहीं है और नतीजा प्राप्त किया है। उस पर, पहला डालने डेटाबेस से एक क्वेरी पर निर्भर है। डेटाबेस उन रिटर्न वादे को कॉल करता है जिनका उपयोग मैं दो कॉलों को अनुक्रम में श्रृंखलाबद्ध करने के लिए करता हूं।
var promise = db.query({parent_id: value});
promise.then(function(query_result) {
var first_value = {
parent_id: query_result[0].parent_id
}
var promise = db.put(first_value);
promise.then(function(first_value_result) {
var second_value = {
reference_to_first_value_id: first_value_result.id
}
var promise = db.put(second_value);
promise.then(function(second_value_result) {
values_successfully_entered();
}, function(err) { return err });
}, function(err) { return err });
}, function(err) { return err });
अब, इस स्थिति में, यदि db.query विफल हो गया है, तो यह पहले के त्रुटि कार्य को कॉल करेगा। लेकिन फिर यह अगले वादे के सफल कार्य को बुलाएगा। जबकि वह वादा पहले मूल्य के परिणामों की अपेक्षा कर रहा है, इसके बजाय इसके त्रुटि हैंडलर फ़ंक्शन से त्रुटि संदेश प्राप्त होगा।
तो, मेरा सवाल यह है कि, अगर मुझे अपने सफल कार्य में त्रुटियों का परीक्षण करना है तो मुझे एक त्रुटि सौंपने का फ़ंक्शन क्यों होगा?
इसकी लंबाई के लिए खेद है। मैं बस यह नहीं जानता था कि इसे कैसे एक और तरीके से समझाया जाए।
अद्यतन और सुधार
(नोट:।। मैं एक प्रतिक्रिया मैं एक बार कुछ टिप्पणी करने के लिए किया था, तो किसी को भी मेरी प्रतिक्रिया पर टिप्पणी की, उनकी टिप्पणी संदर्भ से बाहर लग सकता है तो अब हटा दिया है कि मैं इसे हटा दिया क्षमा करें इसके लिए, मैं इसे यथासंभव छोटा रखने की कोशिश कर रहा हूं।)
उत्तर देने वाले सभी को धन्यवाद। मैं सबसे पहले अपने प्रश्न को इतनी खराब लिखने के लिए माफ़ी मांगना चाहता हूं, खासकर मेरे छद्म कोड। मैं इसे कम रखने की कोशिश में थोड़ा आक्रामक था।
बर्गी की प्रतिक्रिया के लिए धन्यवाद, मुझे लगता है कि मुझे अपने तर्क में त्रुटि मिली है। मुझे लगता है कि मैंने एक और मुद्दा अनदेखा कर दिया है जो समस्या का कारण बन रहा था। यह संभवतः वादे श्रृंखला को अलग-अलग तरीके से काम कर रहा है जैसा मैंने सोचा था। मैं अभी भी अपने कोड के विभिन्न तत्वों का परीक्षण कर रहा हूं, इसलिए मैं यह देखने के लिए एक उचित प्रश्न भी नहीं बना सकता कि मैं अभी क्या गलत कर रहा हूं। हालांकि मैं आपको सभी को अपडेट करना चाहता था और आपकी मदद के लिए धन्यवाद।
आप किस संस्करण का उपयोग कर रहे हैं? यह 0.10.0 पर मेरे लिए 'अस्वीकृत' 3 बार प्रदर्शित करता है और 0.6.3 स्थगित करता है। – loganfsmyth
यह मेरे लिए भी काम करता है और नोड 0.8.3 और डिफर्ड 0.6.3 https://gist.github.com/Stuk/694b2377057453aa6946 –