簡體   English   中英

Ajax文件上傳返回狀態代碼0就緒狀態0(僅在有時)

[英]Ajax file upload returns status code 0 ready state 0 (only sometimes)

我看了下面的帖子

jQuery Ajax - 狀態碼0?

然而,我找不到明確的答案,我在尋找問題的根源時遇到了嚴重的困難,所以我在這里發帖,希望有人可以指出我正確的方向。

在我的代碼中,我正在執行一個Angular HTTP帖子,它只發送基本的JSON數據,然后在成功回調中我使用AJAX將文件上傳到同一個服務器。 (我知道我不應該使用jQuery和Angular但是我暫時無法改變它)

它看起來像這樣

 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請求的另一種方式? 可能同時發送谷歌分析事件干擾?

任何建議都會很棒,如果您想了解有關該問題的更多信息,請告訴我。

這意味着,請求已被取消。

可能有很多不同的原因,但要注意:這也可能是由於瀏覽器錯誤或問題 - 所以我相信(恕我直言)沒有辦法防止這種問題。

例如,您可以獲得503(服務不可用)響應。 在這種情況下你會做什么? 這也是一個零星的,不可預測的問題。 忍住這一點,並嘗試重新發布您的數據。

如果不重新發明輪子,我建議你實現: 使用延遲api重試ajax調用

我的猜測是你的代碼在它實際從調用中返回之前正在執行。 即調用返回並且沒有返回任何內容並且它給出0錯誤。 這是有意義的,因為錯誤是可變的。 大部分時間它會返回正常,因為后端執行得足夠快但有時它不會因為它花了特別長或其他事情發生等等.Javascript永遠不會真正停止執行。 它說它確實,但特別是在angular和jquery之間傳遞多個ajax請求,如果它在實際完成你的角度帖子之前執行第二個ajax調用就不足為奇了。 這就是刷新會復制錯誤的原因,因為它會清除你的變量。

您可以采取一些措施來測試:

  1. 在后端制作一個計時器,在它返回任何東西之前會持續幾秒鍾。 這可能會使您的代碼更加一致地失敗。

  2. 設置斷點並查看它們何時被擊中以及它們在javascript中包含的值。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM