दिलचस्प पोस्ट
वर्तमान में जेयूनिट 4 में परीक्षण निष्पादित करने का नाम प्राप्त करें LINQ: एक ऑब्जेक्ट का चयन करें और एक नया ऑब्जेक्ट बनाने के बिना कुछ गुण परिवर्तित करें मेटाडेटा पुनर्प्राप्त करने में असमर्थ सी # में वर्तमान उपयोगकर्ता के लिए डेस्कटॉप के लिए पथ कैसे प्राप्त करें? क्या मैं एक HTTPModule से सत्र स्थिति का उपयोग कर सकता हूं? यह निर्धारित करने के लिए कि क्या चर 'अपरिभाषित' या 'नल' है? गैर-संख्यात्मक वर्णों को हटाने के लिए टी-एसक्यूएल का चयन करें XMLHttpRequest की प्रतिक्रिया कैसे प्राप्त करें? "android.intent.category.DEFAULT" का उद्देश्य क्या है? इसे एक पथ में स्थायी रूप से जोड़ने के बिना एक सबफ़ोल्डर में एम-फाइल एक्सेस करें बैच स्क्रिप्ट: व्यवस्थापक अधिकारों की जांच कैसे करें पीडीओ तैयार बयान से कच्चे एसक्यूएल क्वेरी स्ट्रिंग प्राप्त करना कई प्रोग्रामिंग भाषाओं में स्ट्रिंग अपरिवर्तनीय क्यों हैं? पायथन – 3 डी वेक्टर का रोटेशन एक एकल निर्भरता की सभी गतिशील निर्भरताओं को छोड़ दें

jQuery स्थगित और वादों – .then () बनाम .Done ()

मैं jQuery के स्थगित और वादों के बारे में पढ़ रहा हूं और मैं सफल कॉलबैक के लिए .done() और .done() का उपयोग करने में अंतर नहीं देख सकता। मुझे पता है कि एरिक हाइंड्स का उल्लेख है कि .done() और। .success() एक ही कार्यक्षमता के लिए मैप करते हैं, लेकिन मैं अनुमान .success() हूं। तब .then() रूप में सभी कॉलबैक सभी एक सफल ऑपरेशन के पूरा होने पर लागू होते हैं

क्या कोई मुझे सही उपयोग के बारे में जान सकता है?

बहुत धन्यवाद

वेब के समाधान से एकत्रित समाधान "jQuery स्थगित और वादों – .then () बनाम .Done ()"

स्थगित हल होने पर done() कॉलबैक को निकाल दिया जाएगा। fail() से जुड़ी कॉलबैक निकाल दिया जाएगा, जब स्थगित अस्वीकार कर दिया जाएगा।

JQuery 1.8 से पहले, then() केवल वाक्यात्मक चीनी थी:

 promise.then( doneCallback, failCallback ) // was equivalent to promise.done( doneCallback ).fail( failCallback ) 

1.8 के अनुसार, then() pipe() लिए एक उपनाम है और एक नया वादा देता है, pipe() पर अधिक जानकारी के लिए यहां देखें।

success() और error() केवल jqXHR ऑब्जेक्ट पर उपलब्ध हैं जो jqXHR को कॉल करके jqXHR । वे क्रमशः done() और fail() लिए सरल उपनाम हैं:

 jqXHR.done === jqXHR.success jqXHR.fail === jqXHR.error 

इसके अलावा, done() केवल एक कॉलबैक तक सीमित नहीं है और गैर-फ़ंक्शंस को फ़िल्टर कर देगा (हालांकि संस्करण 1.8 में तार के साथ एक बग है जिसे 1.8.1 में तय किया जाना चाहिए):

 // this will add fn1 to 7 to the deferred's internal callback list // (true, 56 and "omg" will be ignored) promise.done( fn1, fn2, true, [ fn3, [ fn4, 56, fn5 ], "omg", fn6 ], fn7 ); 

fail() लिए भी जाता है

उस तरीके में भी अंतर होता है जिससे रिटर्न परिणाम संसाधित होते हैं (इसे चेनिंग कहते हैं, चेन नहीं करते हैं, जबकि कॉल कॉल का उत्पादन होता है)

 promise.then(function (x) { // Suppose promise returns "abc" console.log(x); return 123; }).then(function (x){ console.log(x); }).then(function (x){ console.log(x) }) 

निम्न परिणाम लॉग हो जाएंगे:

 abc 123 undefined 

जबकि

 promise.done(function (x) { // Suppose promise returns "abc" console.log(x); return 123; }).done(function (x){ console.log(x); }).done(function (x){ console.log(x) }) 

निम्नलिखित मिलेगा:

 abc abc abc 

———- अद्यतन करें:

Btw। मैं का उल्लेख करना भूल गया, यदि आप परमाणु प्रकार के मूल्य के बजाय वादा वापस करते हैं, तो बाहरी वादा इंतजार करेगा जब तक कि आंतरिक वादा ठीक न हों:

 promise.then(function (x) { // Suppose promise returns "abc" console.log(x); return $http.get('/some/data').then(function (result) { console.log(result); // suppose result === "xyz" return result; }); }).then(function (result){ console.log(result); // result === xyz }).then(function (und){ console.log(und) // und === undefined, because of absence of return statement in above then }) 

इस तरह से यह समानांतर या अनुक्रमिक अतुल्यकालिक कार्यों जैसे कि:

 // Parallel http requests promise.then(function (x) { // Suppose promise returns "abc" console.log(x); var promise1 = $http.get('/some/data?value=xyz').then(function (result) { console.log(result); // suppose result === "xyz" return result; }); var promise2 = $http.get('/some/data?value=uvm').then(function (result) { console.log(result); // suppose result === "uvm" return result; }); return promise1.then(function (result1) { return promise2.then(function (result2) { return { result1: result1, result2: result2; } }); }); }).then(function (result){ console.log(result); // result === { result1: 'xyz', result2: 'uvm' } }).then(function (und){ console.log(und) // und === undefined, because of absence of return statement in above then }) 

उपरोक्त कोड समानांतर में दो एचटीटीपी अनुरोधों को जारी करता है जिससे इस तरह से अनुरोध पूरा हो जाता है, जबकि उन एचटीआई अनुरोधों के नीचे क्रमिक रूप से चल रहे हैं जिससे सर्वर लोड

 // Sequential http requests promise.then(function (x) { // Suppose promise returns "abc" console.log(x); return $http.get('/some/data?value=xyz').then(function (result1) { console.log(result1); // suppose result1 === "xyz" return $http.get('/some/data?value=uvm').then(function (result2) { console.log(result2); // suppose result2 === "uvm" return { result1: result1, result2: result2; }; }); }); }).then(function (result){ console.log(result); // result === { result1: 'xyz', result2: 'uvm' } }).then(function (und){ console.log(und) // und === undefined, because of absence of return statement in above then }) 

.done() में केवल एक कॉलबैक है और यह सफलता कॉलबैक है

.then() को सफलता और विफल कॉलबैक दोनों हैं

.fail() में केवल एक कॉलबैक विफल है

इसलिए यह आप पर निर्भर है कि आपको क्या करना चाहिए … क्या आप परवाह करते हैं कि क्या यह सफल होता है या यदि वह विफल हो जाता है?

deferred.done ()

हैंडलर को केवल तब कहा जाना चाहिए जब डिफर्ड हल हो जाए । आप कॉल करने के लिए कई कॉलबैक जोड़ सकते हैं

 var url = 'http://jsonplaceholder.typicode.com/posts/1'; $.ajax(url).done(doneCallback); function doneCallback(result) { console.log('Result 1 ' + result); } 

आप इस तरह से ऊपर भी लिख सकते हैं,

 function ajaxCall() { var url = 'http://jsonplaceholder.typicode.com/posts/1'; return $.ajax(url); } $.when(ajaxCall()).then(doneCallback, failCallback); 

deferred.then ()

हैंडलर कहलाता है जब डिफर्ड हल हो, अस्वीकार कर दिया या फिर भी प्रगति पर है

 var url = 'http://jsonplaceholder.typicode.com/posts/1'; $.ajax(url).then(doneCallback, failCallback); function doneCallback(result) { console.log('Result ' + result); } function failCallback(result) { console.log('Result ' + result); } 

वास्तव में एक बहुत ही महत्वपूर्ण अंतर है, जैसा कि jQuery के डिफरेड्स का अर्थ वादा करता है (और jQuery3.0 वास्तव में उन्हें कल्पना में लाने की कोशिश करता है) के रूप में होता है

किया / के बीच मुख्य अंतर तो यह है कि

  • .done() हमेशा वही वादे / लिपटे मान लौटाता है, जो कि आपने शुरू किया, चाहे आप क्या करते हैं या आप क्या करते हैं
  • .then() हमेशा एक नया वादा देता है, और आप उस वचन को नियंत्रित करने के प्रभारी हैं जो उस वचन पर आधारित है जो आपने इसे पारित किए गए फ़ंक्शन को वापस लौटा दिया था।

JQuery से मूल ES2015 के वादे में अनुवाद किया गया है,। .done() एक तरह से वादा चेन में एक समारोह के आसपास एक "नल" संरचना को लागू करने की तरह है, यदि यह श्रृंखला "हल" स्थिति में है, तो मान को पास करें एक फ़ंक्शन … परन्तु उस फ़ंक्शन का नतीजा ही श्रृंखला को प्रभावित नहीं करेगा

 const doneWrap = fn => x => { fn(x); return x }; Promise.resolve(5) .then(doneWrap( x => x + 1)) .then(doneWrap(console.log.bind(console))); $.Deferred().resolve(5) .done(x => x + 1) .done(console.log.bind(console)); 

वे दोनों लॉग करेंगे 5, न कि 6

ध्यान दें कि मैंने किया और किया था लॉगिंग करने के लिए लपेटो, नहीं तो। ऐसा इसलिए क्योंकि console.log फ़ंक्शंस वास्तव में कुछ भी वापस नहीं करते हैं और अगर तुम पास हो तो क्या होता है। फिर एक समारोह जो कुछ भी वापस नहीं करता?

 Promise.resolve(5) .then(doneWrap( x => x + 1)) .then(console.log.bind(console)) .then(console.log.bind(console)); 

वह लॉग होगा:

5

अपरिभाषित

क्या हुआ? जब मैंने इसका इस्तेमाल किया और फिर इसे एक समारोह दिया जो कुछ भी वापस नहीं आया, तो यह एक अनूठा परिणाम था "अपरिभाषित" … जो निश्चित रूप से एक वादा [अपरिभाषित] को अगले पद्धति में वापस लाया, जिसने अपरिभाषित लॉग इन किया। तो मूल मूल्य जिसे हमने शुरू किया था, मूलतः खो गया था।

.then() दिल में, फ़ंक्शन संरचना का एक रूप है: प्रत्येक चरण का परिणाम अगले चरण में फ़ंक्शन के तर्क के रूप में उपयोग किया जाता है। यही कारण है कि। सबसे अच्छा एक "टैप" के रूप में सोचा गया है -> यह वास्तव में संरचना का हिस्सा नहीं है, कुछ ऐसा है जो किसी निश्चित चरण में मूल्य पर नज़र डालता है और उस मूल्य पर एक फ़ंक्शन चलाता है, लेकिन वास्तव में यह परिवर्तन नहीं करता है किसी भी तरह से संरचना

यह एक बहुत ही बुनियादी अंतर है, और शायद एक अच्छा कारण है कि देशी वादाओं के पास कोई भी तरीका नहीं है जो कि स्वयं को लागू किया गया। हमें पहले की वजह नहीं है कि इसमें कोई फर्क नहीं पड़ता .फ़ाइल विधि, क्योंकि यह और भी जटिल है (अर्थात्, .fail / .catch .done / .then -> फ़ंक्शन में दर्पण नहीं है। "रहने" के लिए पारित उन लोगों के रूप में अस्वीकार कर दिया। फिर, वे हल!)

then() हमेशा इसका अर्थ है कि इसे जो कुछ भी कहा जाएगा लेकिन पासिंग पैरामीटर अलग-अलग jQuery संस्करणों में अलग हैं।

JQuery 1.8 से पहले, then() बराबर done().fail() और सभी कॉलबैक फ़ंक्शन समान पैरामीटर साझा करते हैं

लेकिन jQuery 1.8 के रूप में, then() एक नया वादा देता है, और अगर यह एक मान वापस करता है, तो उसे अगली कॉलबैक फ़ंक्शन में पारित किया जाएगा।

चलिए निम्नलिखित उदाहरण देखें:

 var defer = jQuery.Deferred(); defer.done(function(a, b){ return a + b; }).done(function( result ) { console.log("result = " + result); }).then(function( a, b ) { return a + b; }).done(function( result ) { console.log("result = " + result); }).then(function( a, b ) { return a + b; }).done(function( result ) { console.log("result = " + result); }); defer.resolve( 3, 4 ); 

JQuery 1.8 से पहले, उत्तर होना चाहिए

 result = 3 result = 3 result = 3 

सभी result 3 लेते हैं। और then() फ़ंक्शन हमेशा एक ही आस्थगित वस्तु को अगले फ़ंक्शन पर गुजरता है।

लेकिन jQuery 1.8 के रूप में, परिणाम होना चाहिए:

 result = 3 result = 7 result = NaN 

क्योंकि पहले then() फ़ंक्शन एक नया वादा देता है, और मान 7 (और यह केवल एकमात्र पैरामीटर है जो आगे बढ़ेगा) अगली done() लिए पारित done() , इसलिए दूसरा done() लिखने के result = 7 दूसरा then() 7 को मान के रूप में लेता a और b के मान के रूप में undefined रूप से लेता है, तो दूसरा then() पैरामीटर NaN के साथ एक नया वादा देता है, और अंतिम परिणाम done() उसके परिणाम के रूप में NaN प्रिंट करता है।

यही मेरा जवाब है

 var deff = $.Deferred(); deff.then(function(){ alert('ok'); var deff = $.Deferred(); setTimeout(function(){ deff.resolve() }, 1000) return deff; }).then(function () { alert('ok2') }) deff.resolve() 

यह then विशिष्ट कार्य है यह कॉलबैक नरक को रोका जा सकता है

.done() वादा चेन को समाप्त करता है, यह सुनिश्चित करने के साथ कि आगे कुछ और नहीं जोड़ सकते हैं इसका मतलब यह है कि jQuery का वादा कार्यान्वयन किसी भी अप्रतिबंधित अपवाद को फेंक सकता है, क्योंकि कोई भी संभवतः इसका उपयोग करके इसे संभालना संभव नहीं है।

व्यावहारिक रूप से, यदि आप किसी वादे के लिए और अधिक कदम संलग्न करने की योजना नहीं बनाते हैं, तो आपको .done() उपयोग करना चाहिए। अधिक विवरण के लिए देखें कि क्यों वादे करने की ज़रूरत है