我遇到了一个问题,jquery ajax函数没有正确地将其结果返回给javascript if语句。
这是问题,我们有一个数据库函数,它生成一长串if / then语句,摘录在
之下if(1==1 && (GenericAjaxValidation("System.Yes")=="Y")) {do stuff}
1 == 1是数据库中发生的事情的结果,所以只需忽略该位。 GenericAjaxValidation调用是给我们问题的部分它调用的javascript函数在下面。
function GenericAjaxValidation(token) {
$.ajax({
type: "Post",
url: '../FormAjax/GetAjaxValResult',
data: {TOKEN:token,FormId:formDisplay.FormID,FormLayoutId:formDisplay.FormLayoutID},
dataType: "json",
timeout: 30000,
async:false,
success: function(obj) {
result=obj.Object.ReturnValue;
},
error: function(obj) {
return false;
},
complete: function(){
return result;
}
});
}
整个过程设置为onchange事件的一部分,我们到达if语句没有问题。如果我将一个断点放入jquery ajax函数中,它会正确处理,并返回它应该的“Y”。但是,当我退回到if语句时,它会失败。我更多地看了一下,并意识到它始终将GenericAjaxValidation的结果视为未定义。事实上,为了测试它,我更改了if语句以测试与undefined的相等性,并且它成功了。
我的怀疑是,虽然asynch:false导致该单个函数的其余部分等待返回,但似乎if语句没有等待它,并且在不等待实际值的情况下进行求值。我在网上搜了大约半个小时,试图找到任何肯定是这样或那样的东西,但我的谷歌今天让我失望了。
所以,我的问题是:有没有办法使这项工作?或者javascript根本不适合这个过程。
答案 0 :(得分:4)
return
语句里面“$ .ajax()”回调函数。这些值不会作为整体功能的结果返回,因为它根本没有return
。
你可以让回调设置一个局部变量,然后返回它,但实际上你不应该首先做同步ajax。
答案 1 :(得分:4)
尝试(未经测试的代码):
function GenericAjaxValidation(token) {
var result
$.ajax({
type: "Post",
url: '../FormAjax/GetAjaxValResult',
data: {TOKEN:token,FormId:formDisplay.FormID,FormLayoutId:formDisplay.FormLayoutID},
dataType: "json",
timeout: 30000,
async:false,
success: function(obj) {
result=obj.Object.ReturnValue;
},
error: function(obj) {
result = false;
}
});
return result;
}
(编辑:正如@toby指出的那样,complete
处理程序是不必要的,不做任何事情)
问题是GenericAjaxValidation
没有返回任何内容。这是返回的complete
函数。返回仅从立即函数返回,而不是封闭函数,因此GenericAjaxValidation
刚刚完成而没有return
为了更清楚,您的原始代码可以编写为功能上相同的(在此示例中注意并且您的原始代码,result
是全局变量)_:
function GenericAjaxValidation(token) {
$.ajax({
type: "Post",
url: '../FormAjax/GetAjaxValResult',
data: {TOKEN:token,FormId:formDisplay.FormID,FormLayoutId:formDisplay.FormLayoutID},
dataType: "json",
timeout: 30000,
async:false,
success: onSuccess,
error: onError,
complete: onComplete
});
//No return statement
}
function onSuccess(obj) {
result=obj.Object.ReturnValue;
}
function onError(obj) {
return false;
}
function onComplete(){
return result;
}
如您所见,GenericAjaxValidation
从不return
任何事情。
答案 2 :(得分:-2)
我怀疑jQuery是在搞砸你。
我建议你尝试删除jQuery ajax调用,而是放入一个常规的XMLHttpRequest对象。我可以向你保证它会起作用。
jQuery - 通过使它们复杂化来简化事物!我编写自己的代码,我知道 完全 它的作用。