【问题标题】:Ajax file upload returns status code 0 ready state 0 (only sometimes)Ajax 文件上传返回状态码 0 就绪状态 0(仅有时)
【发布时间】:2017-10-09 06:51:01
【问题描述】:

我看过下面的帖子

jQuery Ajax - Status Code 0?

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

在我的代码中,我正在执行一个仅发送基本 JSON 数据的 Angular HTTP 帖子,然后在成功回调中,我使用 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请求的另一种方式?同时发送谷歌分析事件是否会产生干扰?

任何建议都会很棒,如果您想了解有关此问题的更多信息,请告诉我。

【问题讨论】:

  • 在请求过程中切换页面或者如果页面没有完全加载并且请求已经开始,可能会发生这种情况?如果数据不正常,可能会发生这种情况?是否触发了某些可能会中断请求的事件?你确定这一切都不是真的吗?因为我猜在处理请求时必须中断请求。
  • 如何处理后端错误?也许也显示后端代码
  • 如果您在复制问题时查看浏览器 devtools 控制台,可能会获得更多信息,方法是点击浏览器上的刷新。网络选项卡也可能包含更多信息(XHR 选项)
  • 你能创建一个 jsfiddle jsfiddle.net 来重现问题吗?
  • 您能在表单上看到您的 html 代码吗?请

标签: javascript php jquery angularjs ajax


【解决方案1】:

我的猜测是您的代码在实际从调用中返回之前正在执行。 IE。调用返回,没有返回任何内容,并给出 0 错误。这是有道理的,因为错误是可变的。大多数时候它会返回正常,因为后端执行得足够快,但有时它不会因为它花费了特别长的时间或发生了其他事情等。Javascript 并没有真正停止执行。它说它确实如此,但特别是在具有多个 ajax 请求的 angular 和 jquery 之间传递,如果它在实际完成您的 angular post 之前执行第二个 ajax 调用也就不足为奇了。这就是为什么刷新会复制错误,因为它会清除您的变量。

你可以做一些事情来测试这个:

  1. 在后端制作一个计时器,它会在返回任何内容之前运行几秒钟。这可能会使您的代码更加一致地失败。

  2. 设置断点并查看它们何时被命中以及它们在 javascript 中包含的值。

祝你好运!

【讨论】:

    【解决方案2】:

    这意味着,请求已被取消。

    这可能有很多不同的原因,但请注意:这也可能是由于浏览器错误或问题 - 所以我相信(恕我直言)没有办法防止此类问题。

    例如,您收到 503(服务不可用)响应。在这种情况下你会怎么做?这也是一个零星的、不可预测的问题。忍受它,并尝试重新发布您的数据。

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

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 2020-09-13
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多