非常简单,但它不会按预期方式运作。
$(function(){
(function(){
/**
* @return boolean Depending on success
*/
function saveOnServer(data){
var result = false;
$.ajax({
url : "/post/write.ajax",
data : data,
success : function(response){
if (response == "1"){
alert('Response is 1. OK');
result = true;
}
}
});
return result;
}
$("#save").click(function(e){
e.preventDefault();
// This inserts some stuff (on the server), but always returns FALSE
if ( saveOnServer($("form").serialize())) ){
alert('1'); // This expected to be alerted
} else {
alert('0'); // <- But... This will be alerted
}
});
})($);
});
问题是response
var始终返回1
,并且它也会警告Response is 1. OK
。但...
result
始终为FALSE
。为什么?
答案 0 :(得分:3)
在此请求完成之前,您无法返回异步请求的结果。
您必须做的是在成功回调中使用结果:
function saveOnServer(data, dowith){
$.ajax({
url : "/post/write.ajax",
data : data,
success : function(response){
doWith(response == "1")
}, error : function() {
doWith(false)
}
});
}
$("#save").click(function(e){
e.preventDefault();
// This inserts some stuff (on the server), but always returns FALSE
saveOnServer($("form").serialize()), function(result){
if (result) {
alert('1'); // This expected to be alerted
} else {
alert('0'); // <- But... This will be alerted
}
});
});
答案 1 :(得分:1)
if ( saveOnServer($("form").serialize())) ){
您正在测试saveOnServer()函数的返回结果。它立即返回值false
,它不等待ajax调用完成。
答案 2 :(得分:1)
与大多数AJAX问题一样,似乎与AJAX有异步,这意味着你希望函数返回一个值,但是ajax请求还没有返回。 尝试添加async:false以确保这是问题所在。
$.ajax({
url : "/post/write.ajax",
data : data,
async:false,
success : function(response){
if (response == "1"){
alert('Response is 1. OK');
result = true;
}
}
});
如果是这样,你应该考虑以在成功函数内部进行功能的方式重做代码。