2017-05-10 26 views
5

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)

jQuery Ajax - Status Code 0?

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.

+1

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

+0

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

+0

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

Trả lời

0

Tôi đoán là mã của bạn đang thực thi trước khi thực sự quay lại cuộc gọi. I E. cuộc gọi quay trở lại và không có gì được trả về và nó đưa ra lỗi 0. Điều này sẽ có ý nghĩa vì lỗi là biến. Hầu hết thời gian nó sẽ trở lại tốt vì backend thực hiện đủ nhanh nhưng đôi khi nó sẽ không phải vì nó mất đặc biệt dài hoặc cái gì khác đã xảy ra vv Javascript không bao giờ thực sự ngừng thực hiện. Nó nói rằng nó không nhưng đặc biệt là đi qua giữa góc và jquery với nhiều yêu cầu ajax nó sẽ không đáng ngạc nhiên nếu nó đã được thực hiện cuộc gọi ajax thứ hai trước khi nó thực sự hoàn thành bài góc của bạn. Đó là lý do tại sao làm mới sẽ nhân rộng lỗi vì nó sẽ xóa các biến của bạn.

Một số điều bạn có thể làm để kiểm tra điều này:

  1. Trên backend làm cho một bộ đếm thời gian mà đi trong vài giây trước khi nó trả về bất cứ điều gì. Điều này có thể làm cho mã của bạn không nhất quán hơn.

  2. Đặt điểm ngắt và xem thời điểm chúng bị trúng và giá trị chúng chứa trong javascript.

Chúc may mắn!

2

Điều này có nghĩa là yêu cầu đã bị hủy.

Có thể có nhiều lý do khác nhau cho điều đó, nhưng lưu ý: điều này cũng có thể do lỗi trình duyệt hoặc vấn đề - vì vậy tôi tin (IMHO) không có cách nào để ngăn chặn loại vấn đề này.

Hãy nghĩ ví dụ, bạn nhận được phản hồi 503 (Không có dịch vụ). Bạn sẽ làm gì trong trường hợp như vậy? Đây cũng là một vấn đề lẻ tẻ và không thể đoán trước được. Chỉ cần sống với điều đó và cố gắng đăng lại dữ liệu của bạn.

Xplorer, tôi đề nghị bạn thực hiện: Retrying ajax calls using the deferred api

Các vấn đề liên quan