javascript - Ajax 文件上传返回状态码 0 就绪状态 0(仅有时)

标签 javascript php jquery angularjs ajax

我看了下面的帖子

jQuery Ajax - Status Code 0?

但是我找不到明确的答案,而且我在寻找问题的根源时遇到了严重的问题,所以我在这里发帖,希望有人能指出我正确的方向。

在我的代码中,我执行了一个仅发送基本 JSON 数据的 Angular HTTP post,然后在成功回调中我使用 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(服务不可用)响应。在这种情况下你会怎么做?这也是一个偶发的、不可预测的问题。接受它,并尝试重新发布您的数据。

在不重新发明轮子的情况下,我建议您实现: Retrying ajax calls using the deferred api

关于javascript - Ajax 文件上传返回状态码 0 就绪状态 0(仅有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895579/

相关文章:

Javascript 链式规则,返回特定值而不是 [Object object] [x]

php - 如何在Sonata中搜索json列?

jquery - fancybox.js 、缺少 Sprite 、Rails 的异常照片行为

php - 用于测量请求速度和数据库速度的工具

javascript - Google map 限时在标记上弹跳动画

javascript - 使 Accordion/Collapsible 中的 DIV 固定在页面的顶部和底部

javascript - react 组件 - 在调整 react 元素的大小时更改子内容(当宽度变窄时) - 而不是通过固定断点的窗口大小

php - 重音字符使独立的 PHP 解释器崩溃

php - mysqli_query() 期望参数 2 为字符串

javascript - 从元素的子元素中删除特定的事件处理程序