सफलता और .done () $ .ajax की विधि के बीच अंतर क्या है


102

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

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


आपने $ .ajax () की एक विधि () विधि के बारे में कहां पढ़ा है? AFAIK किया गया तरीका $ .Deferred ऑब्जेक्ट से संबंधित है। शायद आप इसके बजाय .complete () के बारे में बात कर रहे हैं?
फबरीज़ियो काल्डेरन


2
ठीक है, यह jQuery 1.8 है। चूंकि $ .jax ने jQuery 1.5 से एक वादा वापस किया है। यह स्थिरता के मामले के लिए एक सरल प्रतिस्थापन है (आस्थगित के इंटरफ़ेस का उपयोग करके): किया () सफलता के स्थान पर (), असफल () त्रुटि के लिए () एंड ऑलवेज () फॉर
फुल

2
वास्तविक परिवर्तन यह है कि आप प्रोग्रामिक रूप से कई कॉलबैक संलग्न कर सकते हैं। $ .Deferred प्रलेखन पृष्ठ देखें।
फबरीज़ियो काल्डेरन

जवाबों:


8

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

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


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

25
यह उत्तर बात याद आती है। success: एक पैरामीटर के .success()रूप में और एक विधि के रूप में उपयोग किए जाने के बीच एक अंतर है jqXHR। बाद में पदावनत किया जा रहा है, लेकिन पूर्व वही है जिसके बारे में ओपी पूछ रहा था।
अलनीतक

2
सफलता / त्रुटि / पूरा पदावनत और AJAX राज्य परिवर्तनों पर आधारित है; किया / विफल / हमेशा jQuery के आस्थगित राज्य परिवर्तनों पर आधारित होते हैं। Api.jquery.com/category/deferred-object देखें ।
मिकीयरिस

28
मैं एक उत्तर पर विश्वास नहीं कर सकता, जो इस सवाल का गलत अर्थ लगाता है कि यह सर्वोच्च मतदान और स्वीकृत समाधान दोनों है ...
ट्रांसेंडेंस

108

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

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

हालाँकि आप अभी भी पुराने वाक्य रचना के साथ 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 की आस्थगित वस्तु के साथ संगतता के लिए है । आस्थगित (और अब Promise, जिसमें क्रोम और एफएक्स में पूर्ण देशी ब्राउज़र समर्थन है) आपको अतुल्यकालिक कार्यों की श्रृंखला करने की अनुमति देता है:

$.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); 
}

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

@ सुहैल - वास्तव में कोई भी नहीं हैं; jQuery 1.6 में success, jQuery 1.8 में था , जिसे इसके द्वारा बदल दिया गया है done। वे उसी तरह से काम करते हैं, लेकिन doneबाकी jQuery के साथ अधिक सुसंगत हैं।
कीथ

@ आज के साथ, का उपयोग करते हुए .done सफलता का उपयोग करने के समान है? या कुछ और भी नया है?
रॉक्सी’प्रो

@ Roxy'Pro यह पुराना था जब मैंने इसका उत्तर दिया, तो मैं निश्चित रूप से 2018 में इसका उपयोग नहीं करूंगा। .donejQuery के शुरुआती (और अब मृत-अंत) स्टैब क्या बन गया Promiseऔर अब इसे काफी व्यापक भाषा समर्थन प्राप्त है। नई परियोजनाओं में मैं const response = await fetch(...)इसके बजाय उपयोग करूंगा ।
कीथ

6

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

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

promise.done(doneCallback).fail(failCallback)

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

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

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.