2012-01-12 14 views
264

मैं कुछ हफ्तों के लिए jQuery और AJAX के साथ काम कर रहा हूं और कॉल करने के बाद मैंने स्क्रिप्ट को जारी रखने के दो अलग-अलग तरीकों को देखा: success: और .donejQuery.ajax हैंडलिंग प्रतिक्रिया जारी रखें: "सफलता:" बनाम ".done"?

jQuery documentation हम मिल से सार से:

.done(): विवरण: संचालकों जोड़े जब आस्थगित वस्तु हल हो गई है कहा जाता है।

सफलता: (.ajax() विकल्प): अनुरोध सफल होने पर एक फ़ंक्शन कॉल किया जाना चाहिए।

तो, दोनों AJAX कॉल को पूरा/हल करने के बाद कुछ करते हैं। क्या मैं एक या दूसरे को यादृच्छिक रूप से उपयोग कर सकता हूं? अंतर क्या है और जब किसी के बजाय किसी का उपयोग किया जाता है?

उत्तर

399

success jQuery में सफलता कॉलबैक का पारंपरिक नाम रहा है, जिसे अजाक्स कॉल में एक विकल्प के रूप में परिभाषित किया गया है। हालांकि, $.Deferreds के कार्यान्वयन के बाद और अधिक परिष्कृत कॉलबैक, done सफलता कॉलबैक को लागू करने का पसंदीदा तरीका है, क्योंकि इसे किसी भी deferred पर कॉल किया जा सकता है।

उदाहरण के लिए, सफलता:

$.ajax({ 
    url: '/', 
    success: function(data) {} 
}); 

उदाहरण के लिए, किया:

$.ajax({url: '/'}).done(function(data) {}); 

अच्छी बात के बारे में done कि $.ajax के रिटर्न मान अब एक आस्थगित वादा है कि करने के लिए बाध्य किया जा सकता है है आपके आवेदन में कहीं और। तो मान लीजिए कि आप इस अजाक्स कॉल को कुछ अलग स्थानों से बनाना चाहते हैं। फ़ंक्शन के विकल्प के रूप में आपके सफलता फ़ंक्शन में गुजरने के बजाय, यह अजाक्स कॉल बनाता है, आप केवल $.ajax फ़ंक्शन वापस कर सकते हैं और done, fail, then, या जो भी हो, के साथ अपने कॉलबैक को बाध्य कर सकते हैं। ध्यान दें कि always एक कॉलबैक है जो यह चलाएगा कि अनुरोध सफल हुआ या विफल हो गया है या नहीं। done केवल सफलता पर ट्रिगर किया जाएगा।

उदाहरण के लिए:

function xhr_get(url) { 

    return $.ajax({ 
    url: url, 
    type: 'get', 
    dataType: 'json', 
    beforeSend: showLoadingImgFn 
    }) 
    .always(function() { 
    // remove loading image maybe 
    }) 
    .fail(function() { 
    // handle request failures 
    }); 

} 

xhr_get('/index').done(function(data) { 
    // do stuff with index data 
}); 

xhr_get('/id').done(function(data) { 
    // do stuff with id data 
}); 

रख-रखाव के मामले में इस बात का महत्वपूर्ण लाभ यह है कि आप एक आवेदन विशेष समारोह में अपने ajax तंत्र लपेटा गया है। यदि आप तय करते हैं कि भविष्य में अलग-अलग काम करने के लिए आपको $.ajax कॉल की आवश्यकता है, या आप एक अलग AJAX विधि का उपयोग करते हैं, या आप jQuery से दूर जाते हैं, तो आपको केवल xhr_get परिभाषा को बदलना होगा (एक वादा वापस करना सुनिश्चित करें या कम से कम done उपरोक्त उदाहरण के मामले में विधि)। पूरे ऐप में अन्य सभी संदर्भ समान रह सकते हैं।

वहाँ कई और अधिक (बहुत कूलर) चीजें आप $.Deferred साथ कर सकते हैं, जिनमें से एक भी जब $.ajax अनुरोध ही सफल होता है, pipe उपयोग करने के लिए सर्वर द्वारा रिपोर्ट एक त्रुटि पर एक विफलता को गति प्रदान करने के लिए है रहे हैं।उदाहरण के लिए:

function xhr_get(url) { 

    return $.ajax({ 
    url: url, 
    type: 'get', 
    dataType: 'json' 
    }) 
    .pipe(function(data) { 
    return data.responseCode != 200 ? 
     $.Deferred().reject(data) : 
     data; 
    }) 
    .fail(function(data) { 
    if (data.responseCode) 
     console.log(data.responseCode); 
    }); 
} 

xhr_get('/index').done(function(data) { 
    // will not run if json returned from ajax has responseCode other than 200 
}); 

पढ़ें $.Deferred के बारे में अधिक यहाँ: http://api.jquery.com/category/deferred-object/

नोट: jQuery 1.8 के रूप में, pipe बिल्कुल उसी तरह then का उपयोग कर के पक्ष में पदावनत किया गया है।

+2

मुझे आश्चर्य है कि 'सफलता:' /'.done() 'की इंटरैक्शन कैसे परिभाषित की जाती है। जैसे 'सफलता है:' इन दिनों पहले '.done()' के रूप में लागू किया गया था? –

+5

आपका मतलब है कि अगर आपके पास अजाक्स कॉल पर 'सफलता:' और '.done' दोनों हैं? अच्छा प्रश्न। चूंकि अन्य सभी कॉलबैक को क्रम में बुलाया जाता है कि वे बाध्य हैं, मेरा अनुमान हां है, 'सफलता' को केवल पहले कहा जाता है। – glortho

+1

हां, यह वास्तव में मामला प्रतीत होता है: http://jsfiddle.net/9L7dD/ – Adam

2

यदि आपको अपने AJAX में async: false की आवश्यकता है, तो आपको .done के बजाय success का उपयोग करना चाहिए। अन्यथा आप .done का उपयोग करने के लिए बेहतर हैं। यह jQuery official site से है:

jQuery 1.8,async के उपयोग के रूप में: jqXHR ($ .Deferred) के साथ झूठे बहिष्कृत हो गई है; आप सफलता/त्रुटि/पूरा कॉलबैक विकल्प बजाय jqXHR वस्तु जैसे jqXHR.done() की इसी तरीकों का उपयोग करना होगा।

संबंधित मुद्दे