Tôi đã xem xét các chủ đề sautập Ajax upload trả về mã trạng thái 0 sẵn sàng trạng thái 0 (chỉ thỉnh thoảng)
Tuy nhiên tôi không thể tìm thấy một câu trả lời dứt khoát và tôi đang gặp khó khăn nghiêm trọng cố gắng tìm nguồn gốc của vấn đề của tôi vì vậy tôi đăng bài ở đây với hy vọng rằng ai đó có thể chỉ cho tôi đi đúng hướng.
Trong mã của mình, tôi đang thực hiện bài đăng HTTP góc mà chỉ gửi dữ liệu JSON cơ bản, sau đó gọi lại AJAX để tải tệp lên cùng một máy chủ. (Tôi biết tôi không nên sử dụng jQuery và góc tuy nhiên tôi không thể thay đổi điều này cho thời điểm này)
Nó trông giống như
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);
}
}
})
}
Không mã chính xác này của tôi, nhưng gần như giống nhau chính xác.
Vấn đề là nó hoạt động gần như mọi lúc, nhưng có thể ba hoặc bốn trong vài trăm sẽ thất bại. Bởi không, tôi có nghĩa là chức năng xử lý lỗi được gọi là chức năng tải tệp lên và các tệp không được tải lên.
Tôi nhận được jqXHRStatus 0 và jqXHRReadyState 0 khi điều này xảy ra.
Cách duy nhất tôi có thể tái tạo vấn đề là bằng cách nhấn refresh trên trình duyệt khi yêu cầu đang được xử lý, tuy nhiên người dùng đã khuyên họ không làm điều này (mặc dù có đến 100% xác nhận điều này)
Có lẽ có một lỗ hổng nghiêm trọng trong mã của tôi mà tôi không thấy? Có thể vượt qua biến trì hoãn xung quanh không phải là thực hành tốt? Hoặc một cách khác yêu cầu ajax đang bị hủy bỏ mà tôi không xem xét? Có thể gửi các sự kiện phân tích trên google cùng một lúc để can thiệp không?
Mọi lời khuyên sẽ tuyệt vời và vui lòng cho tôi biết nếu bạn muốn biết thêm thông tin về vấn đề này.
Nó có thể xảy ra nếu trang được bật trong yêu cầu hoặc có thể nếu nó không phải là nạp đầy đủ và yêu cầu đã bắt đầu? Nó có thể xảy ra nếu dữ liệu không phải là o.k.? Một số sự kiện được kích hoạt có thể phá vỡ yêu cầu không? Bạn chắc chắn không có gì trong số này là sự thật? Bởi vì một cái gì đó phải phá vỡ yêu cầu trong khi xử lý của nó, tôi đoán. – Blackbam
làm thế nào để bạn xử lý các lỗi back-end? Có thể hiển thị mã phụ trợ quá – alepeino
bạn có thể nhận được nhiều thông tin hơn nếu bạn xem bảng điều khiển của trình duyệt devtools khi bạn sao chép sự cố bằng cách nhấn làm mới trên trình duyệt. Tab Mạng cũng có thể có thêm thông tin (tùy chọn XHR) – KorreyD