我正在使用成功,失败和状态代码处理程序发出ajax post请求。但是,当请求因400错误而失败时,仍会调用部分成功函数。有人可以告诉我为什么吗?
$.ajax({
type: "POST",
url: saveToGetTalentUrl.url,
data: JSON.stringify(candidateList),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
$("#save_to_getTalent").replaceWith("Saved to getTalent");
alert("New User " + response.candidate.full_name + " created successfully");
console.log(msg);
//normalExec(response, msg);
},
error: function (errormessage) {
console.log(errormessage);
},
statusCode: {
400:function(){
alert(errors.err400);
},
401:function(){
alert(errors.err401);
},
403:function(){
alert(errors.err403);
},
500:function(){
alert(errors.err500);
}
}
});
}
当调用因400错误而失败时,将显示statusCode中的错误,并从错误函数中记录错误,但同时也会调用行$("#save_to_getTalent").replaceWith("Saved to getTalent");
。我不明白为什么
答案 0 :(得分:0)
尝试设置async: true
以查看会发生什么。
请参阅ajax
的jQuery文档中的此部分:
async(默认值:true)
类型:布尔值
默认情况下,所有请求都是异步发送的(默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和dataType:" jsonp"请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()。
因此,默认情况下请求(async: true
)是逐个发送的,而不是全部一起发送。如果POST需要一段时间,您可能会看到在 POST请求完全返回之前执行回调函数。当执行success
的第一行时,它会被阻止,因为您弹出了一个对话框;同时,statusCode
部分也被执行;它一直持续到最后,因为那里什么都没阻挡。
使用对话框调试不是最好的解决方案,因为它总是阻塞;您可以尝试更改某个元素的值以查看执行顺序,例如更改<input>
的值,附加一个数字以查看整数字符串是否更改,以查看是否存在success
和statusCode
的竞争条件。
类似的东西:
$.ajax({
data:
url:
success: function(returned, status, xhr) {
$('#testInput').val($('#testInput').val() + "1");
},
error: function (errormessage) {
$('#testInput').val($('#testInput').val() + "2");
},
statusCode: {
400:function(){
$('#testInput').val($('#testInput').val() + "3");
},
401:function(){
$('#testInput').val($('#testInput').val() + "4");
},
403:function(){
$('#testInput').val($('#testInput').val() + "5");
},
500:function(){
$('#testInput').val($('#testInput').val() + "6");
}
}
});