我有保存时验证重复名称的表单,我使用webapi进行处理。以下是一个示例函数,它通过onclick="return validateName()"
从按钮单击调用。
function validateName() {
var nam = $('#frmeditCategory input[id="Name"]').val();
var result = false;
$.ajax({
type: "POST",
url: "/Admin/CategoryName",
data: { Name: "test"},
dataType: "json",
success: function (response) {
if (response.message == true) {
alert("Category already exists.");
result = false;
alert(0);
return false;
}
else {
result = true;
alert("1");
return true;
}
},
error: function (xhr, ajaxOptions, thrownError) { alert("some error occured"); result = false; }
});
alert("2");
return false;
}
首先执行alert("2");
然后执行ajax。我很困惑,我不知道我做错了什么。请帮帮我们!!!
答案 0 :(得分:2)
alert("2")
需要放在$.ajax
承诺回调中:
$.ajax({
type: "POST",
url: "/Admin/CategoryName",
data: { Name: "test"},
dataType: "json",
success: function (response) {
if (response.message == true) {
alert("Category already exists.");
result = false;
// Why are the following here, they will never get called?
// alert(0);
// return false;
} else {
// Why is this line here, you never use it?
// result = true;
alert("1");
return true;
}
},
error: function (xhr, ajaxOptions, thrownError) {
alert("some error occured");
result = false;
}
}).done(function () {
alert("2");
});
答案 1 :(得分:1)
ajax调用是异步请求。当您调用方法时,您正在启动请求。但是,请求可能需要一段时间才能完成,直到您从服务器获取数据或发生错误。
当数据从服务器到达时,执行ajax中的函数,这就是为什么此警报仅在警报(“2”)之后完成;
答案 2 :(得分:1)
默认情况下,Ajax调用是异步的,这意味着代码执行不会停止等待ajax调用返回,而是在http请求返回并且调用了ajax回调之前很久就会继续并到达alert(2)
语句。 / p>
您也可以执行同步ajax调用,但这通常不是一个好主意,因为其他内容会在调用返回之前冻结。