我查看了以下线程:jQuery Ajax - Status Code 0?。然而,我没有找到一个明确的答案,而且我正在努力寻找问题的根源,因此我在这里发布帖子,希望有人能指点我正确的方向。
在我的代码中,我执行一个Angular HTTP post,它只发送基本的JSON数据,然后在成功回调函数中,我使用AJAX将文件上传到同一台服务器。(我知道我不应该同时使用jQuery和Angular,但我目前无法改变这一点)
它看起来像这样:
在我的代码中,我执行一个Angular HTTP post,它只发送基本的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请求的另一种方式?同时发送谷歌分析事件会干扰吗?
如果您有任何建议,请告诉我,如果您需要更多信息,请告诉我。