2012-01-13 15 views
89

की सफलता और .done() विधि के बीच क्या अंतर है क्या कोई मेरी मदद कर सकता है?
$.ajax के success और .done() के बीच अंतर को समझने में सक्षम नहीं हूं।

यदि संभव हो तो कृपया उदाहरण दें।

+0

आपने $ .ajax() की एक पूर्ण() विधि के बारे में कहाँ पढ़ा? AFAIK किया गया विधि $ से संबंधित है। ऑब्जेक्ट ऑब्जेक्ट। हो सकता है कि आप इसके बजाय .complete() के बारे में बात कर रहे हों? Http://api.jquery.com/jQuery पर – fcalderan

+1

।AJAX/पृष्ठ –

+2

ठीक है, यह jQuery 1.8 है :) चूंकि $ .ajax jQuery 1.5 से एक वादा वापस करता है। यह स्थिरता के मामले (स्थगित इंटरफ़ेस का उपयोग करके) के लिए एक साधारण प्रतिस्थापन है: किया गया() सफलता() विफल हो जाता है() पूर्ण() और हमेशा() के लिए() – fcalderan

उत्तर

8

संक्षेप में, AJAX फ़ंक्शन से सफलतापूर्वक कॉलबैक फ़ंक्शन को कम करने के बाद, आप बाद में अपने स्वयं के हैंडलर को संशोधित किए बिना जोड़ सकते हैं मूल कोड (पर्यवेक्षक पैटर्न)।

यहां से अधिक विस्तृत जानकारी प्राप्त करें: https://stackoverflow.com/a/14754681/1049184

+1

और इसके नीचे उदाहरण किए गए समकक्षता => सफलता, असफल => त्रुटि और हमेशा => पूर्ण – StuartLC

+23

यह उत्तर बिंदु को याद करता है। 'JqXHR' पर विधि के रूप में 'सफलता:' के बीच एक पैरामीटर और' .success() 'के बीच एक अंतर है। उत्तरार्द्ध को बहिष्कृत किया जा रहा है, लेकिन पूर्व ओपी क्या पूछ रहा था। – Alnitak

+1

सफलता/त्रुटि/पूर्ण बहिष्कृत हैं और AJAX राज्य परिवर्तनों के आधार पर; किया/असफल/हमेशा jQuery Deferred राज्य परिवर्तन पर आधारित हैं। Http://api.jquery.com/category/deferred-object/ देखें। – mickeyreiss

90

success केवल अगर आग लगती है तो AJAX कॉल सफल होता है, यानी अंततः एक HTTP 200 स्थिति देता है। सफलता के बावजूद अनुरोध समाप्त होने पर error आग विफल हो जाती है और complete आग लगती है।

jqXHR वस्तु success (द्वारा $.ajax लौटे) पर jQuery 1.8 में fail और always साथ complete साथ done, error से बदला गया।

हालांकि आपको अभी भी पुराने वाक्यविन्यास के साथ AJAX अनुरोध आरंभ करने में सक्षम होना चाहिए। इसलिए इन समान बातें करते हैं:

// set success action before making the request 
$.ajax({ 
    url: '...', 
    success: function(){ 
    alert('AJAX successful'); 
    } 
}); 

// set success action just after starting the request 
var jqxhr = $.ajax("...") 
    .done(function() { alert("success"); }); 

यह परिवर्तन jQuery 1.5 के deferred object साथ संगतता के लिए है। स्थगित (और अब Promise, जिनमें Chrome और विदेशी मुद्रा में पूर्ण स्थानीय ब्राउज़र समर्थन हासिल है) आप श्रृंखला के लिए अनुमति देते अतुल्यकालिक कार्रवाई:

$.ajax("parent"). 
    done(function(p) { return $.ajax("child/" + p.id); }). 
    done(someOtherDeferredFunction). 
    done(function(c) { alert("success: " + c.name); }); 

कार्यों की यह श्रृंखला कॉलबैक आप success साथ मिल के एक नेस्टेड पिरामिड की तुलना में बनाए रखने के लिए आसान है।

हालांकि, कृपया कि done अब Promise वाक्य रचना के पक्ष में पदावनत किया गया है ध्यान दें कि then बजाय का उपयोग करता है:

$.ajax("parent"). 
    then(function(p) { return $.ajax("child/" + p.id); }). 
    then(someOtherDeferredFunction). 
    then(function(c) { alert("success: " + c.name); }). 
    catch(function(err) { alert("error: " + err.message); }); 

यह गोद लेने के लायक है क्योंकि async और await वादों सुधार वाक्य रचना (और त्रुटि हैंडलिंग) का विस्तार:

try { 
    var p = await $.ajax("parent"); 
    var x = await $.ajax("child/" + p.id); 
    var c = await someOtherDeferredFunction(x); 
    alert("success: " + c.name); 
} 
catch(err) { 
    alert("error: " + err.message); 
} 
+0

फ़ंक्शन निर्माण, और अनुरोध करने के बाद फ़ंक्शन सेट करें। ऐसा लगता है कि दोनों एक जैसे हैं ... क्या आप मुझे कुछ और अंतर दिखाएंगे ??? – suhailvs

+0

@ सुहैल - वास्तव में कोई भी नहीं है; jQuery 1.6 में jQuery सफलता 1.8 में 'सफलता' थी, जिसे' किया गया 'द्वारा प्रतिस्थापित किया गया है। वे एक ही तरीके से काम करते हैं, लेकिन 'किया' बाकी jQuery के साथ अधिक संगत है। – Keith

0

success कॉलबैक जब अनुरोध सफल होने और $.ajax कॉल का हिस्सा है कि लागू किया जाता है। done वास्तव में ऑब्जेक्ट का हिस्सा $.ajax() द्वारा लौटाया गया है, और jQuery 1.8 में success को प्रतिस्थापित करता है।

5

.success() केवल तभी कॉल किया जाता है जब आपका वेबसर्वर 200 ओके HTTP शीर्षलेख के साथ प्रतिक्रिया करता है - मूल रूप से जब सबकुछ ठीक होता है।

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

promise.done(doneCallback).fail(failCallback) 

.done() has only one callback and it is the success callback 
+2

यह ध्यान देने योग्य है कि .success() को तब नहीं कहा जाता है जब विकृत JSON को 200/OK स्थिति कोड के साथ वापस भेजा जाता है। विशेष रूप से, मैंने वेबरवर बैकएंड कोड के साथ NaN मान उत्पन्न करने और उन्हें जावास्क्रिप्ट NaN (यानी एक प्रतीक के रूप में, स्ट्रिंग 'NaN' नहीं) के रूप में क्रमबद्ध करने के साथ एक समस्या में भाग लिया है जो वास्तव में मान्य JSON नहीं है - इसलिए JSON के रूप में प्रतिक्रिया का विश्लेषण विफल रहता है और .fail() निष्पादित किया जाता है, लेकिन प्रतिक्रिया स्थिति 200 है। लेकिन यह अभी भी सच है कि सफलता केवल ओके स्टेटस कोड के साथ बुलाया जाता है; बस यह इंगित करना चाहता था कि सिर्फ इसलिए कि यह ठीक है, इसका मतलब यह नहीं है कि यह 'सफल' है;) – Kasapo