2013-03-10 7 views
8

jQuery के AJAX .fail() एक अच्छा त्रुटि हैंडलर कि संभालती है "404 नहीं मिला" त्रुटियों और इस तरह है, लेकिन हम कैसे सामान्य त्रुटि मामलों को संभालने के लिए .done() अंदर से जानबूझ कर यह कॉल कर सकते हैं, उदाहरण के लिए जब डेटा उपयोगकर्ता द्वारा प्रदान की सही नहीं है?सामान्य त्रुटियों को संभालने के लिए .done() से .fail() को कैसे कॉल करें?

+2

एक बार '.done() 'निष्पादित हो गया है और आप उस कॉलबैक में हैं, क्या एक ही वादे ऑब्जेक्ट पर' .fail()' करने का निर्णय लेने में बहुत देर हो चुकी है? आपको अधिक पारंपरिक जावास्क्रिप्ट त्रुटि हैंडलिंग जैसे अपवाद या त्रुटि जांच या ऑब्जेक्ट पर अपनी त्रुटि कॉलबैक डालना चाहिए। – jfriend00

उत्तर

10

आप एक सामान्य फ़ंक्शन का उपयोग कर सकते हैं जिसे प्रत्येक मामले में त्रुटि पर बुलाया जाता है।

$.ajax('url') 
    .done(function(data, textStatus, jqXHR) { 
     if(data == 'Invalid') { 
      ajaxError(jqXHR, "usererror"); 
     } 
    }) 
    .fail(ajaxError); 

function ajaxError(jqXHR, textStatus, errorThrown) { 
    console.log('Ajax error: ' + textStatus); 
} 
3

@ Juhana के कोड सबसे हालात के लिए अच्छा होगा।

अगर, हालांकि, त्रुटियों कि पैदा हो सकता है मज़बूती से data के निरीक्षण ने भविष्यवाणी नहीं की जा सकती अकेला है, तो इस संस्करण पर विचार करें:

$.ajax('url').done(function(data, textStatus, jqXHR) { 
    try { 
     var dataLooksGood = ......;//(boolean) Test data for predictable data errors here 
     if(!dataLooksGood) throw(new Error("data invalid");) 
     //Handle data here. 
     //Any naturally-ocurring errors or further manually-thrown errors will be caught below. 
    } 
    catch(err) { 
     ajaxError(jqXHR, "AJAX successful but: " + err.message); 
    } 
}).fail(ajaxError).always(function() { 
    //Here do whatever is necessary after success or error 
}); 


function ajaxError(jqXHR, textStatus, errorThrown) { 
    console.log('AJAX error: ' + textStatus); 
} 

त्रुटियों को पकड़ने के द्वारा, always हैंडलर यहां तक ​​कि एक unpredicted अगर आग की अनुमति दी जाएगी त्रुटि अवसर। इस प्रकार आप बेहतर गारंटी दे सकते हैं कि एक त्रुटि होने पर ध्यान दिए बिना "लोडिंग ..." संदेश या स्पिनर ग्राफिक मारा गया था।

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