繁体   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