2017-05-10 2 views
5

Ich habe im folgenden Thread sahAjax-Datei-Upload liefert Statuscode 0 Bereitschaftszustand 0 (nur manchmal)

jQuery Ajax - Status Code 0?

Jedoch habe ich keine endgültige Antwort finden konnte, und ich habe ernsthafte Probleme versuchen zu finden Die Quelle meines Problems, also poste ich hier in der Hoffnung, dass jemand mich in die richtige Richtung weisen kann.

In meinem Code führe ich einen Angular HTTP-Post aus, der nur grundlegende JSON-Daten sendet, dann benutze ich im On-Success-Callback AJAX, um Dateien auf denselben Server hochzuladen. (Ich weiß, ich sollte nicht jQuery und Angular verwenden jedoch kann ich das im Moment nicht ändern)

Es sieht so etwas wie dieses

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); 
     } 
    } 
}) 

} 

Nicht mein genauen Code, aber fast genau die gleiche.

Das Problem ist, dass funktioniert fast die ganze Zeit, aber vielleicht drei oder vier in jedem paar hundert wird fehlschlagen. Mit "fehlgeschlagen" meine ich, dass die Fehlerbehandlungsfunktion für die Datei-Upload-Funktion aufgerufen wird und die Dateien nicht hochgeladen werden.

Ich bekomme jqXHRStatus 0 und jqXHRReadyState 0, wenn dies auftritt.

Der einzige Weg, ich bin in der Lage, das Problem zu replizieren durch das Drücken der Refresh im Browser ist, wenn die Anforderung verarbeitet wird, haben jedoch die Benutzer darauf hingewiesen werden sie dies nicht tun (obwohl zu 100% bestätigt dieses)

Gibt es vielleicht einen schwerwiegenden Fehler in meinem Code, den ich nicht sehe? Vielleicht ist die Weitergabe von aufgeschobenen Variablen keine gute Praxis? Oder anders gesagt, die Ajax-Anfrage wird annulliert, die ich nicht in Erwägung ziehe? Könnte das gleichzeitige Senden von Google Analytics-Ereignissen störend sein?

Jeder Rat wäre toll und bitte lassen Sie mich wissen, wenn Sie weitere Informationen zu diesem Thema wünschen.

+1

Es kann passieren, wenn Seite bei Anforderung oder vielleicht, wenn es eingeschaltet ist beginnt nicht vollständig geladen und die Anforderung bereits? Es kann passieren, wenn Daten nicht in Ordnung sind. Wird ein Ereignis ausgelöst, das die Anfrage möglicherweise unterbricht? Bist du dir sicher, dass nichts davon wahr ist? Weil etwas die Anfrage während der Verarbeitung brechen muss, denke ich. – Blackbam

+0

Wie behandeln Sie Back-End-Fehler? Vielleicht zeigen Backend-Code zu – alepeino

+0

Sie erhalten möglicherweise weitere Informationen, wenn Sie die Browser Devtools Konsole anzeigen, wenn Sie das Problem replizieren, indem Sie die Aktualisierung im Browser treffen. Die Registerkarte "Netzwerk" enthält möglicherweise weitere Informationen (XHR-Option) – KorreyD

Antwort

0

Meine Vermutung ist, dass Ihr Code ausgeführt wird, bevor es tatsächlich von dem Anruf zurückkommt. I.e. Der Anruf geht zurück und nichts wurde zurückgegeben und es gibt einen 0 Fehler. Dies wäre sinnvoll, da der Fehler variabel ist. Die meiste Zeit würde es gut gehen, weil das Backend schnell genug ausgeführt wurde, aber manchmal nicht, weil es besonders lange gedauert hat oder etwas anderes passiert ist usw. Javascript stoppt die Ausführung nie wirklich. Es sagt, dass es vor allem aber zwischen eckigen und jQuery mit mehreren Ajax-Anforderungen passiert, es wäre nicht überraschend, wenn es den zweiten Ajax-Aufruf ausführte, bevor es Ihren eckigen Post tatsächlich fertigstellte. Aus diesem Grund würde eine Aktualisierung den Fehler replizieren, da dies Ihre Variablen bereinigen würde.

Einige Dinge, die Sie tun können, um dies zu testen:

  1. Auf dem Back-End-Timer machen, die für ein paar Sekunden geht, bevor er etwas zurückgibt. Dies wird wahrscheinlich dazu führen, dass Ihr Code konsistenter ausfallen wird.

  2. Setzen Sie Haltepunkte und sehen Sie, wenn sie getroffen werden und die Werte, die sie im Javascript enthalten.

Viel Glück!

2

Dies bedeutet, dass die Anfrage abgebrochen wurde.

Es könnte viele verschiedene Gründe dafür geben, aber sei dir bewusst: dies könnte auch an einem Browser Bug oder Problem liegen - also glaube ich (IMHO) gibt es keine Möglichkeit diese Art von Problemen zu verhindern.

Denken Sie zum Beispiel, Sie erhalten eine 503 (Service nicht verfügbar) Antwort. Was würden Sie in einem solchen Fall tun? Dies ist auch ein sporadisches und nicht vorhersehbares Problem. Leben Sie damit und versuchen Sie, Ihre Daten erneut zu veröffentlichen.

ohne das Rad neu zu erfinden, ich schlage vor, Sie zu implementieren: Retrying ajax calls using the deferred api