我查看了以下帖子
然而,我找不到明确的答案,我在寻找问题根源时遇到了严重的困难,所以我在这里发帖,希望有人能指出我正确的方向。
在我的代码中,我正在执行一个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。
我能够复制问题的唯一方法是在处理请求时点击浏览器上的刷新,但是用户已经建议他们不这样做(尽管必须100%确认这一点)
我的代码中是否存在严重缺陷,我没有看到?也许传递延迟变量不是很好的做法?或者我正在考虑取消ajax请求的另一种方式?可能同时发送谷歌分析事件干扰?
任何建议都会很棒,如果您想了解有关该问题的更多信息,请与我们联系。
答案 0 :(得分:2)
这意味着,请求已被取消。
可能有很多不同的原因,但请注意:这也可能是由于浏览器错误或问题 - 所以我相信(恕我直言)没有办法阻止这类问题。
例如,您可以获得503(服务不可用)响应。在这种情况下你会做什么?这也是一个零星的,不可预测的问题。忍住这一点,并尝试重新发布您的数据。
如果不重新发明轮子,我建议您实施: Retrying ajax calls using the deferred api
答案 1 :(得分:0)
我的猜测是你的代码在实际从调用中返回之前正在执行。即调用返回并且没有返回任何内容,它给出了0错误。这是有意义的,因为错误是可变的。大部分时间它会返回正常,因为后端执行速度足够快,但有时它不会因为它耗时特别长或其他事情发生等等.Javascript并没有真正停止执行。它说它确实如此但特别是在有多个ajax请求的angular和jquery之间传递,如果它在它实际完成你的角度帖子之前执行第二个ajax调用它将不会令人惊讶。这就是为什么刷新会复制错误的原因,因为它会清除你的变量。
你可以采取一些措施来测试这个:
在后端制作一个计时器,它会在返回任何内容之前持续几秒钟。这可能会使您的代码更加一致地失败。
设置断点并查看它们何时被点击以及它们在javascript中包含的值。