2010-09-01 21 views
9

नमस्ते मैंने देखा है कि इस सरल कोड जिस तरह से यह काम करने के लिए माना जाता है काम नहीं करता है ...

function test() { 
    $.ajax({ 
     'url' : 'test/GameConfiguration.json', 
     'dataType' : 'json', 
     data : { 
      a : 'aaa' 
     }, 
     cache : false, 
     method : 'get', 
     timeout : 10000, //10 secs of timeout 
     success : function(data, textStatus, XMLHttpRequest) { 
      console.log("success"); 
      if (data == null) 
       console.log("it's not a real success"); 
     }, 
     error : function(XMLHttpRequest, textStatus, errorThrown) { 
      console.log("error: " + textStatus); 
     } 
    }); 
} 

परीक्षण स्थानीय होस्ट पर चलाया जा रहा है, मेरा मतलब है: मैं पृष्ठ लोड करता हूं, मैंने स्थानीय वेबसर्वर को बंद कर दिया है, फिर मैं अनुरोध को आग लगाता हूं (इस फ़ंक्शन पर इंगित करने वाले ऑनक्लिक के साथ एक साधारण बटन के माध्यम से)। त्रुटि कभी भी नहीं बुलाई जाती है, जो मुझे मिलता है वह सफलता हैंडलर कहलाता है और इसमें टेक्स्टस्टैटस = "सफलता" और डेटा = शून्य है। मैं यह भी ध्यान देता हूं कि 10 सेकंड से पहले अनुरोध समय समाप्त हो गया है। यह फ़ायरफ़ॉक्स (अंतिम संस्करण), क्रोम (अंतिम संस्करण) और सफारी 5 पर होता है। यह क्यों? क्या यह इस तथ्य के कारण है कि मैं लोकलहोस्ट पर काम कर रहा हूं?


मैं यह बताना भूल गया: अनुरोध कैश नहीं किया गया है। असल में फायरबग और क्रोम देव उपकरण दोनों विफल होने का अनुरोध दिखाते हैं।


बिग अद्यतन

यह व्यवहार स्थानीय होस्ट के उपयोग से संबंधित है। असल में यदि मैं इस पृष्ठ को किसी अन्य कॉलेग्यू पीसी से लोड करता हूं और अनुरोध को ट्रिगर करने से पहले मैं अपने पीसी को नेटवर्क से डिस्कनेक्ट करता हूं, तो मुझे सही समय पर त्रुटि के साथ त्रुटि के साथ निकाल दिया जाता है। मुझे लगता है कि यह jQuery की एक बग है। यह मेरे समय समाप्ति त्रुटियों :(परीक्षण करने के लिए कड़ी मेहनत कर देगा


दोस्तों से jQuery मंचों कहते हैं कि यह देखते हुए कि मेजबान स्थानीय होस्ट है जिस तरह से नेटवर्क स्टैक कनेक्शन रोकता की वजह से है। मैं विंडोज 7 पर इस परीक्षण किया केवल आप अन्य सिस्टम पर इस परीक्षण की तरह लग रहा है और आप jQuery मंचों पर कुछ jQuery internals, इस पोस्ट के लिए रिपोर्ट पर काम कर सकते हैं:।,

http://forum.jquery.com/topic/strange-and-unexpected-behaviour-of-ajax-error-and-localhost#14737000001331961

+2

कर सकते हैं आप ' 'url'' और'' dataType'' तार के रूप में उद्धृत क्यों हैं तो यह लगता है 0. के बराबर कोई HTTP स्थिति कोड कर रहे हैं? – Codesleuth

+0

मैंने उद्धरण हटाने की कोशिश की: कोई फर्क नहीं पड़ता – gotch4

+0

क्या आप इसके लिए डेमो पेज दिखा सकते हैं? – Nalum

उत्तर

7

अद्यतन: परीक्षण (data == null) को (XMLHttpRequest.readyState === 4 && XMLHttpRequest.status === 0) पर प्रतिस्थापित करने का प्रयास करें।

डब्ल्यू 3 सी उम्मीदवार में XMLHttpRequest मानक के बारे में सिफारिश का वर्णन किया गया है कि यह "त्रुटि ध्वज" नामित होना चाहिए जिसका उपयोग किसी प्रकार की नेटवर्क त्रुटि या गर्भपात को इंगित करने के लिए किया जाना चाहिए। इस तरह की त्रुटियों के मामले में XMLHttpRequest में स्थिति 200 ("ठीक"), 201 ("बनाया गया"), 304 ("संशोधित नहीं") के बजाय 0 होगी और इसी तरह। http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 0 या 1 ("UNSENT" या "OPENED") के बराबरके अनुरूप होने के लिए 0 0 हो सकता है। एक और मामला XMLHttpRequest.readyState 4 के बराबर है ("हो गया") और "त्रुटि ध्वज" सत्य है। अगर हमारे पास इन दो मामलों में से कोई नहीं है तो XMLHttpRequest.status एक HTTP स्थिति कोड होना चाहिए। http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html या http://www.w3.org/Protocols/HTTP/1.0/spec.html#Status-Codes के तहत मेरे कि आप निम्न

jQuery(document).ready(function() { 
    $.ajax({ 
     type: 'GET', 
     url: 'test/GameConfiguration.json', 
     dataType: 'json', 
     cache : false, 
     success: function(data, textStatus, xhr){ 
      if (xhr.readyState === 4 && xhr.status === 0) { 
       // if readyState is DONE (numeric value 4) then corresponds to 
       // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-done 
       // "The DONE state has an associated error flag that indicates 
       // some type of network error or abortion." 
       // Corresponds to http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute 
       // If error flag it true, xhr.status is 0. 
       alert('"error flag\" is true. It means that we have a network error"+ 
         " or abortion (for example because of Same Origin Policy restrictions)'); 
      } 
      else { 
       alert(textStatus); 
       alert(data); 
      } 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      if (textStatus !== null) { 
       alert("error: " + textStatus); 
      } else if (errorThrown !== null) { 
       alert("exception: " + errorThrown.message); 
      } 
      else { 
       alert ("error"); 
      } 
     } 
    }); 
}); 
+0

धन्यवाद, यह अधिक मजबूत लगता है। वैसे भी मैंने यह सब jQuery फोरम में पोस्ट किया और कुछ देव ने इस बारे में परवाह करना शुरू कर दिया। मैंने कुछ डीबग लॉग भी भेजे और शायद यह बात ठीक हो जाएगी। – gotch4

+0

@ gotch4: मुझे आपकी पोस्ट jQuery बग रिपोर्ट में नहीं मिल सका। क्या आप संदर्भ पोस्ट कर सकते हैं? मुझे http://dev.jquery.com/ticket/6060 जैसी कुछ अन्य करीबी रिपोर्ट मिलीं। ऐसा लगता है कि परिवर्तन http://dev.jquery.com/changeset/6432 जो ओपेरा के लिए वर्कअराउंड करने का प्रयास करता है, गलत लागू किया गया था और अन्य ब्राउज़रों में XMLHttpRequest.status = 0 के मामले में अब गलत काम करता है। यदि आप ऐसा नहीं करते हैं। मैं आपकी बग रिपोर्ट संदर्भ http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute में सम्मिलित करने के लिए आपको सलाह दूंगा। JQuery के कोड को कम से कम मानकों का पालन करना चाहिए और फिर किसी भी कामकाज को लागू करने का प्रयास करना चाहिए। – Oleg

-2

यहां तक ​​कि अगर आप स्थानीय सर्वर को बंद कर दिया यह अभी भी चाहिए जेसन फ़ाइल देखने में सक्षम हो .. फ़ाइल को अस्थायी रूप से हटाने का प्रयास करें और देखें कि क्या यह काम करता है।

+0

यदि मैं फ़ाइल को हटाता हूं और सर्वर चालू है, तो निश्चित रूप से मुझे 404 मिलते हैं और त्रुटि हैंडलर आग लगती है। अगर मैं फ़ाइल को हटा देता हूं और सर्वर बंद हो जाता है, तो वही परिणाम। – gotch4

1

यदि नेटवर्क त्रुटि है तो success कॉलबैक को कॉल किया जाएगा और error नहीं होगा, भले ही यह अधिक समझ में न आए। विवरण के लिए चेकआउट this blog post। तो मूल रूप से आपने data == null की जांच करके क्या किया है सही है।

+0

कृपया मेरा उत्तर और कोड उदाहरण देखें। आप परिणामों की व्याख्या कैसे करते हैं? क्या आपको लगता है कि हमारे पास jQuery में एक बग है? – Oleg

+0

नहीं, आपका परीक्षण गलत है: आप पोर्ट नंबर बदल रहे हैं। समान उत्पत्ति नीति प्रतिबंधों के कारण इसकी अनुमति नहीं है: http://en.wikipedia.org/wiki/Same_origin_policy। यदि आप पोर्ट नंबर बदलते हैं तो आप AJAX क्वेरी नहीं कर सकते हैं। –

+0

आप सही हैं, कि मेरा पहला उदाहरण समान "मूल नीति प्रतिबंध" त्रुटि के रूप में व्याख्या किया जाना चाहिए। मैं http://www.w3.org/TR/XMLHttpRequest के आधार पर कोड का नया संस्करण लिखता हूं, जो मुझे लगता है कि दोनों मामलों में एक त्रुटि का पता लगा सकता है: "मूल नीति प्रतिबंध" या नेटवर्क त्रुटियों पर किसी भी तरह का। इन सभी मामलों में "सफलता" हैंडलर की कॉल को एक त्रुटि के रूप में व्याख्या किया जाना चाहिए। इस सुझाव के बारे में आप क्या सोचते हैं? – Oleg

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