2011-06-07 12 views
38

jquery AJAX फ़ंक्शन का उपयोग करके, मैं कुछ ऐसा कर सकता हूं:सर्वर प्रतिक्रिया के आधार पर jquery.ajax() त्रुटि कॉलबैक कैसे ट्रिगर करें, HTTP 500 नहीं?

$.ajax({ 

    url: url, 
    type: 'GET', 
    async: true, 
    dataType: 'json', 
    data: data, 

success: function(data) { 

    //Handle server response here 

    }, 

error: function(xhr, status, error){ 

    //Handle failure here 

} 

}); 

मुझे उपरोक्त कोड के आधार पर पूछने के लिए दो प्रश्न हैं:

  1. jquery.ajax() error कॉलबैक कहलाएगा ??

  2. क्या होगा यदि सर्वर मुझे स्ट्रिंग संदेश के साथ एक जेसन ऑब्जेक्ट प्रतिक्रिया देता है " त्रुटि है"। जिसका अर्थ है कि अनुरोध अभी भी सफलतापूर्वक भेज रहा है, लेकिन मुझे सर्वर प्रतिक्रिया {message: "There is an error"} मिला है।

मुझे कोई फर्क नहीं पड़ता कि स्ट्रिंग वैल्यू सर्वर का क्या जवाब है, अगर ग्राहक को सर्वर की प्रतिक्रिया मिलती है, तो jquery.ajax()success कॉलबैक किसी भी तरह से ट्रिगर किया जाएगा।

मैं यह पूछना चाहता हूं कि सर्वर विशेष रूप से {message: 'There is an error'} जैसे स्ट्रिंग मान के साथ एक JSON ऑब्जेक्ट लौटाता है, सर्वर कुछ ऐसा कर सकता है ताकि यह प्रतिक्रिया jquery.ajax()error कॉलबैक में success कॉलबैक के बजाय संभाला जा सके ?

उत्तर

27

त्रुटि कॉलबैक निष्पादित किया जाएगा जब सर्वर से प्रतिक्रिया आप की अपेक्षा नहीं की जा रही है। तो यह स्थितियों में यह उदाहरण के लिए:

  • HTTP 404/500 या किसी अन्य HTTP त्रुटि संदेश ग़लत प्रकार का
  • डेटा प्राप्त हो गया है प्राप्त किया गया था (अर्थात आप की उम्मीद है JSON, आप कुछ और ही प्राप्त हुआ है)।

आपकी स्थिति में डेटा सही है (यह एक JSON संदेश है)। यदि आप प्राप्त डेटा के मूल्य के आधार पर त्रुटि कॉलबैक मैन्युअल रूप से ट्रिगर करना चाहते हैं तो आप इतना आसान कर सकते हैं। नाम के फ़ंक्शन में त्रुटि के लिए अनाम कॉलबैक को बस बदलें।

function handleError(xhr, status, error){ 

    //Handle failure here 

} 

$.ajax({ 

    url: url, 
    type: 'GET', 
    async: true, 
    dataType: 'json', 
    data: data, 

success: function(data) { 
    if (whatever) { 
     handleError(xhr, status, ''); // manually trigger callback 
    } 
    //Handle server response here 

    }, 

error: handleError 
}); 
+2

एक अलग अलग स्थान में हैंडलररर क्यों परिभाषित करें? इसे इस तरह की इनलाइन को परिभाषित न करें: 'त्रुटि: हैंडलर = फ़ंक्शन (xhr, स्थिति) {// हैंडल सर्वर प्रतिक्रिया यहां} ' – dallin

+1

@ डेलिन क्योंकि यह आपको कोड डुप्लिकेट करने की अनुमति नहीं देता है। सर्वर कोड 200 के साथ प्रतिक्रिया दे सकता है जो "सफलता" कॉलबैक को ट्रिगर करता है। या, 400, 404, या 500 जैसे खराब कोड "त्रुटि" कॉलबैक को ट्रिगर करेंगे। दोनों स्थितियों में आप शायद एक केंद्रीकृत तरीके से त्रुटि को संभालना चाहते हैं। –

+1

@ माइकलबटलर मुझे लगता है कि आप गलत सुझाव दे सकते हैं कि मैं क्या सुझाव दे रहा था। मुझे विश्वास है कि आप त्रुटि संपत्ति में सीधे हैंडलरर नामक एक फ़ंक्शन को परिभाषित कर सकते हैं (त्रुटि: handleError = function (xhr, status))। यह आपको अभी भी फ़ंक्शन को मैन्युअल रूप से कॉल करने और केंद्रीयकृत स्थान में त्रुटि को संभालने की अनुमति देता है। यह चीजों को केंद्रीकृत करने, एजेक्स कॉल में सीधे त्रुटि को संभालने में रखेगा। यहां सरलीकृत उदाहरण के साथ एक jsfiddle है: http://jsfiddle.net/dhq01bLv/ – dallin

3

त्रुटि कॉलबैक तब होता है जब अजाक्स राउंड-ट्रिप सफलतापूर्वक पूर्ण नहीं हो सका, आपके सर्वर तर्क के आधार पर कुछ नहीं। सफलता कॉलबैक के अंदर आप जो सफल प्रतिक्रिया मानते हैं, उसकी जांच करना आपकी ज़िम्मेदारी होगी। यानी एक एकल IF सशर्त जोड़ें जो जांचता है कि संदेश = "कोई त्रुटि हुई थी।" और वहां अपना त्रुटि तर्क शामिल करें, अन्यथा सफलता तर्क करें।

जो भी आप पूछते हैं उसे करने का एक तरीका यह होगा कि त्रुटि होने पर सर्वर 404 शीर्षलेख लौटाएगा, फिर इसे त्रुटि कॉलबैक द्वारा संभाला जाएगा। इस दृष्टिकोण के साथ समस्या यह है कि यदि वास्तविक त्रुटियां हैं तो आप छिप जाएंगे, और आप इसके साथ अतिरिक्त डेटा पास नहीं कर पाएंगे।

+0

मैं देख रहा हूँ, तो त्रुटि कॉलबैक को गति प्रदान करने का कोई तरीका क्या सर्वर responsed के आधार पर होती है , सही? – Leem

+0

@ लिम यह सिर्फ एक समारोह है ... मुझे जवाब देने में कठिनाई हो रही है कि प्रतिक्रिया डेटा में त्रुटि की जांच करने के बजाय आप ऐसा क्यों करना चाहते हैं। हालांकि मैंने एक हैक विधि जोड़ा। – Fosco

+0

मैं देखना चाहता हूं कि मेरे मामले में त्रुटि कॉलबैक ट्रिगर करने की संभावना है, उम्मीद है कि यह प्रेरणा आपको अधिक कठिन समय नहीं देगी। रायल का जवाब मुझे स्पष्ट करता है। धन्यवाद भी। – Leem

2
करने के लिए

सरल बात तो की तरह पुनर्गठन करने होगा:

function handleAjaxError function(xhr, status, error) { 
    //Handle failure here 
} 

$.ajax({ 
    url: url, 
    type: 'GET', 
    async: true, 
    dataType: 'json', 
    data: data, 

    success: function(data) { 

    //Handle server response here 
    if (data.message == 'There is an error') 
    { 
     handleAjaxError(); 
     return; 
    } 

    //... all is good.... 

    }, 
    error: handleAjaxError 
}); 
21

हम अनुमान सर्वर JSON भेज रहा है, और एक सफल अनुरोध के मामले में हम कुछ इस तरह मिल जाएगा:

{ 
    success: true, 
    data: { 
     name: 'Foo' 
    } 
} 

...और विफलता पर:

$.get('http://localhost/api').then(function(res) { 
    var filter = $.Deferred(); 

    if (res.success) { 
     filter.resolve(res.data); 
    } else { 
     filter.reject(res.error); 
    } 

    return filter.promise(); 
}).done(function(data) { 
    console.log('Name:', data.name); // Outputs: Foo 
}).fail(function(error) { 
    console.log('Error:', error); // Outputs: Something bad happened. 
}) 
+0

शानदार। मुझे लगता है कि ओपी ने वास्तव में यही पूछा था। – Jeroen

0

एक आसान यह सिर्फ jQuery हमेशा() फ़ंक्शन अपने कॉलबैक के लिए और फिर अगर उपयोग करने के लिए है करने के लिए जिस तरह से:

{ 
    success: false, 
    error: 'Something bad happened.' 
} 

तो हम बस एक $.Deferred साथ प्रतिक्रिया को फ़िल्टर आप मैन्युअल रूप से एक त्रुटि बनाना चाहते हैं बस डक टाइपिंग का लाभ उठाएं!

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

$.get(url, {"data": data}).always(function(result) 
{ 
    if (typeof result.status !== "undefined" && result.status !== 200) // Status code 200 represents Success/OK 
    { 
     //handle error 
     error = "Your error was " + result.status + " " + result.statusText; 
    } 
    else 
    { 
     //success 
    } 
}); 

त्रुटि अनुभाग हमेशा अगर वहाँ था एक प्राकृतिक हेडर त्रुटि जैसे 404 नहीं मिला चलाया जाएगा। आप मैन्युअल रूप से एक त्रुटि वापस करना चाहते हैं, तो आप सिर्फ सामान्य रूप से एक त्रुटि (PHP में जैसे) के साथ पारित कर दिया एक्सएचआर वस्तु का अनुकरण कर सकते हैं:

public function ServerSideAjaxResponse($data) 
{ 
    if (!$data) 
    { 
     $response["status"] = 1001; //Make up your own error codes! Yippee! Fun! 
     $response["statusText"] = "Error! You forgot to send the data!"; 
     echo json_encode($return); 
     return; 
    } 
} 
संबंधित मुद्दे