2017-05-10 16 views
5

मैं निम्नलिखित धागा पर ध्यान दिया हैअजाक्स फाइल अपलोड रिटर्न स्थिति कोड 0 तैयार राज्य 0 (केवल कभी कभी)

jQuery Ajax - Status Code 0?

हालांकि मैं एक निश्चित उत्तर नहीं मिल सका और मैं गंभीर संकट खोजने की कोशिश कर रहा हूँ मेरे मुद्दे का स्रोत इसलिए मैं उम्मीदों में यहां पोस्ट कर रहा हूं कि कोई मुझे सही दिशा में इंगित कर सकता है।

मेरे कोड में मैं एक कोणीय HTTP पोस्ट कर रहा हूं जो केवल मूल JSON डेटा भेजता है, फिर सफलता कॉलबैक के भीतर मैं उसी सर्वर पर फ़ाइलों को अपलोड करने के लिए AJAX का उपयोग कर रहा हूं। (मैं जानता हूँ कि मैं jQuery और कोणीय नहीं का उपयोग करना चाहिए लेकिन मैं पल के लिए इसे बदल नहीं सकते)

यह इस

var deferred = $q.defer() 

// first post 
$http.post(url,payload,{params: params, headers: headers) 
    .then(function(response) { 

    uploadFiles(response,deferred); 
    // I am also sending google analytics events here 

    }, function(error) { 
     // do error stuff 
    } 

    return deferred.promise; 

// upload files function 
function uploadFiles(response,deferred){ 

$ajax({ 
    type: 'POST', 
    processData: false, 
    contentType: false, 
    data: data // this new FormData() with files appended to it, 
    url: 'the-endpoint-for-the-upload', 
    dataType: 'json', 
    success: function(data) { 
    // do success stuff here 
    deferred.resolve(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 

      var message = {}; 

      if (jqXHR.status === 0) { 
       message.jqXHRStatusIsZero = "true"; 
      } 

      if (jqXHR.readyState === 0) { 
       message.jqXHRReadyStateIsZero = "true"; 
      } 

      if (jqXHR.status === '') { 
       message.jqXHRStatusIsEmptyString = "true"; 
      } 

      if (jqXHR.status) { 
       message.jqXHRStatus = jqXHR.status; 
      } 

      if (jqXHR.readyState) { 
       message.jqXHRReadyState = jqXHR.readyState; 
      } 

      if (jqXHR.responseText) { 
       message.jqXHR = jqXHR.responseText; 
      } 

      if (textStatus) { 
       message.textStatus = textStatus; 
      } 

      if (errorThrown) { 
       message.errorThrown = errorThrown; 
      } 

      message.error = 'HTTP file upload failed'; 

      logError(message); 

      deferred.resolve(message); 
     } 
    } 
}) 

} 

नहीं मेरे सटीक कोड लेकिन लगभग ठीक उसी तरह दिखता है।

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

मुझे ऐसा होने पर jqXHRStatus 0 और jqXHRReadyState 0 मिलता है।

एक ही रास्ता मैं इस मुद्दे को दोहराने के लिए सक्षम हूँ ब्राउज़र जब अनुरोध संसाधित किया जा रहा है पर ताज़ा मारकर है, लेकिन उन की सलाह दी है कि वे यह नहीं कर रहे हैं

(100% की पुष्टि इस किया है, हालांकि)

क्या मेरे कोड में शायद कोई गंभीर दोष है जिसे मैं नहीं देख रहा हूं? शायद चारों ओर स्थगित चर गुजरना अच्छा अभ्यास नहीं है? या किसी अन्य तरीके से AJAX अनुरोध रद्द कर दिया जा रहा है कि मैं विचार नहीं कर रहा हूं? एक ही समय में Google Analytics ईवेंट भेजना हस्तक्षेप कर सकता है?

कोई सलाह बहुत अच्छी होगी और अगर आप इस मुद्दे पर अधिक जानकारी चाहते हैं तो कृपया मुझे बताएं।

+1

अगर पेज या हो सकता है यह पूरी तरह से लोड नहीं है और अनुरोध पहले से ही शुरू होता है, तो अनुरोध के दौरान चालू किया जाये यह हो सकता है? ऐसा तब हो सकता है जब डेटा ओके नहीं है? क्या कुछ घटनाएं निकाल दी गई हैं जो अनुरोध तोड़ सकती हैं? आप निश्चित रूप से कुछ भी सच नहीं है? क्योंकि प्रसंस्करण के दौरान मुझे कुछ अनुरोध तोड़ना चाहिए। – Blackbam

+0

आप बैक-एंड त्रुटियों को कैसे प्रबंधित करते हैं? हो सकता है कि बैकएंड कोड भी दिखाएं – alepeino

+0

यदि आप ब्राउज़र पर रीफ्रेश मारकर समस्या को दोहराने के दौरान ब्राउज़र devtools कंसोल देखते हैं तो आपको अधिक जानकारी मिल सकती है। नेटवर्क टैब में और जानकारी भी हो सकती है (एक्सएचआर विकल्प) – KorreyD

उत्तर

0

मेरा अनुमान है कि आपका कोड वास्तव में कॉल से वापस आने से पहले निष्पादित हो रहा है। अर्थात। कॉल वापस चला गया और कुछ भी वापस नहीं किया गया था और यह 0 त्रुटि देता है। यह समझ में आता है क्योंकि त्रुटि परिवर्तनीय है। अधिकांश समय यह ठीक से वापस आ जाएगा क्योंकि बैकएंड पर्याप्त तेज़ी से निष्पादित होता है लेकिन कभी-कभी ऐसा नहीं होता क्योंकि यह विशेष रूप से लंबा होता है या कुछ और हुआ होता है। जावास्क्रिप्ट कभी भी निष्पादन को रोक नहीं देता है। यह कहता है कि यह करता है लेकिन विशेष रूप से कई AJAX अनुरोधों के साथ कोणीय और jquery के बीच गुजर रहा है, यह आश्चर्यजनक नहीं होगा अगर यह वास्तव में आपके कोणीय पद को पूरा करने से पहले दूसरे AJAX कॉल को निष्पादित कर रहा था। यही कारण है कि एक ताज़ा करें त्रुटि को दोहराना होगा क्योंकि यह आपके चर को साफ़ करेगा।

कुछ बातें आप इस परीक्षण करने के लिए कर सकते हैं:

  1. बैकएंड पर एक टाइमर से पहले यह कुछ भी देता है कि कुछ सेकंड के लिए चला जाता है बनाते हैं। यह संभवतः आपका कोड अधिक लगातार विफल हो जाएगा।

  2. ब्रेकपॉइंट्स सेट करें और देखें कि उन्हें कब मारा जा रहा है और वे जावास्क्रिप्ट में मौजूद मान हैं।

शुभकामनाएँ!

2

इसका मतलब है, अनुरोध रद्द कर दिया गया है।

इसके लिए कई अलग-अलग कारण हो सकते हैं, लेकिन जागरूक रहें: यह ब्राउज़र बग या समस्या के कारण भी हो सकता है - इसलिए मेरा मानना ​​है कि (आईएमएचओ) इस तरह के मुद्दों को रोकने के लिए कोई रास्ता नहीं है।

उदाहरण के लिए सोचें, आपको 503 (सेवा अनुपलब्ध) प्रतिक्रिया मिलती है। इस तरह के मामले में आप क्या करेंगे? यह भी एक छद्म और अनुमानित मुद्दा नहीं है। बस इसके साथ रहें, और अपने डेटा को दोबारा पोस्ट करने का प्रयास करें।

पहिया पुनर्रचना के बिना, मैं सुझाव है कि आप लागू करने के लिए: Retrying ajax calls using the deferred api

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