我有一个javascript函数,它调用泛型函数来对服务器进行ajax调用。我需要从ajax调用的回调函数中检索结果(true / false),但我得到的结果总是“未定义”。
没有我所有逻辑的通用函数的超简化版本将是:
function CallServer(urlController) {
$.ajax({
type: "POST",
url: urlController,
async: false,
data: $("form").serialize(),
success:
function(result) {
if (someLogic)
return true;
else
return false;
},
error:
function(errorThrown) {
return false;
}
});
}
调用它的函数将是:
function Next() {
var result = CallServer("/Signum/TrySave");
if (result == true) {
document.forms[0].submit();
}
}
“result”变量总是“未定义”,并且调试它我可以看到正在执行回调函数的“return true”行。
有关为何发生这种情况的任何想法?我怎么能冒泡从回调函数到CallServer函数的返回值?
由于
答案 0 :(得分:15)
以防你想要采用异步方式(这是一个更好的解决方案,因为它不会在执行请求时冻结你的浏览器),这里是代码:
function CallServer(urlController, callback) {
$.ajax({
type: "POST",
url: urlController,
async: true,
data: $("form").serialize(),
success:
function(result) {
var ret = ( someLogic );
callback(ret);
},
error:
function(errorThrown) {
return false;
}
});
}
function Next() {
CallServer("/Signum/TrySave", function(result) {
if (result == true) {
document.forms[0].submit();
}
});
}
答案 1 :(得分:0)
我通常会在回调函数本身内部成功执行任何代码。我认为CallServer()
实际上并没有收到回调本身的返回值。
尝试类似:
function CallServer(urlController) {
$.ajax({
type: "POST",
url: urlController,
async: false,
data: $("form").serialize(),
success:
function(result) {
if (someLogic)
document.forms[0].submit();
else
// do something else
},
error:
function(errorThrown) {
// handle error
}
});
}
编辑:我对jQuery不太熟悉,所以我可能完全错了(我基于其他框架的行为,比如YUI,以及没有任何框架的AJAX调用)。如果是这样,只需将此答案投票并留下评论,我将删除此答案。
答案 2 :(得分:0)
刚刚找到了怎么做:)声明一个变量并相应地从回调函数更新它。之后我可以返回该变量。我为未来的读者放置了代码:
function CallServer(urlController) {
var returnValue = false;
$.ajax({
type: "POST",
url: urlController,
async: false,
data: $("form").serialize(),
success:
function(result) {
if (someLogic){
returnValue = true;
return;
}
},
error:
function(errorThrown) {
alert("Error occured: " + errorThrown);
}
});
return returnValue;
}