Javascript Ajax文件上载返回状态代码0就绪状态0(仅有时)

Javascript Ajax文件上载返回状态代码0就绪状态0(仅有时),javascript,php,jquery,angularjs,ajax,Javascript,Php,Jquery,Angularjs,Ajax,我已经看了下面的线程 然而,我无法找到一个明确的答案,我在试图找到问题的根源时遇到了严重的困难,所以我在这里发帖,希望有人能为我指明正确的方向 在我的代码中,我正在执行一个角度HTTP post,它只发送基本的JSON数据,然后在on success回调中,我使用AJAX将文件上载到同一服务器。(我知道我不应该使用jQuery和Angular,但目前我无法更改) 看起来像这样 var deferred = $q.defer() // first post $http.post(url,

我已经看了下面的线程

然而,我无法找到一个明确的答案,我在试图找到问题的根源时遇到了严重的困难,所以我在这里发帖,希望有人能为我指明正确的方向

在我的代码中,我正在执行一个角度HTTP post,它只发送基本的JSON数据,然后在on success回调中,我使用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和jqxhreadystate 0

我能够复制问题的唯一方法是在处理请求时点击浏览器上的刷新按钮,但是用户建议他们不要这样做(尽管必须100%确认)

我的代码中是否存在我没有看到的严重缺陷?也许传递延迟变量不是一种好的做法?还是我没有考虑的取消ajax请求的另一种方式?同时发送谷歌分析事件是否会造成干扰


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

我猜您的代码在实际从调用中返回之前正在执行。也就是说,呼叫返回,没有返回任何内容,并且给出了一个0错误。这是有意义的,因为错误是可变的。大多数情况下,它会返回良好状态,因为后端执行速度足够快,但有时不会,因为它花费了特别长的时间或发生了其他事情等。Javascript从未真正停止执行。它说可以,但特别是在angular和jquery之间传递多个ajax请求。如果它在实际完成angular文章之前执行第二个ajax调用,那就不足为奇了。这就是为什么刷新会复制错误,因为它会清除变量

您可以做一些事情来测试这一点:

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

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


  • 祝你好运

    这意味着请求已被取消

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

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

    在不改变方向盘的情况下,我建议您实施:

    如果在请求过程中切换页面,或者如果页面未完全加载且请求已经开始,则可能会发生这种情况?如果数据不正常,可能会发生这种情况。?是否触发了可能会中断请求的事件?你确定这些都不是真的吗?因为在处理请求的过程中,一定有什么东西破坏了请求。您如何处理后端错误?可能显示后端代码如果在复制问题时查看浏览器devtools控制台,则可以通过点击浏览器上的刷新按钮获得更多信息。“网络”选项卡可能还有更多信息(XHR选项)。您可以创建一个JSFIDLE来重现这个问题吗?您可以在表单上看到您的html代码吗?请