Ich habe im folgenden Thread sahAjax-Datei-Upload liefert Statuscode 0 Bereitschaftszustand 0 (nur manchmal)
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.
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
Wie behandeln Sie Back-End-Fehler? Vielleicht zeigen Backend-Code zu – alepeino
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