Ajax函数作为javascript比较的一部分
Ajax function as part of a javascript comparison
我遇到了一个问题,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语句在等待它,并且在不等待实际值的情况下求值。我在网上搜索了大约半个小时,试图找到任何可以肯定的说法,但我的Google-Fu今天失败了。
所以,我的问题是:有没有办法让这个工作?还是javascript在这个过程中表现不佳?
Try(未测试代码):
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
函数。return只从直接函数返回,而不是从封闭函数返回,因此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
是什么
return
语句位于 "$.ajax()"回调函数内。这些值不会作为整个函数的结果返回,因为它根本没有return
。
你可以用回调来代替设置一个局部变量,然后返回它,但是你真的不应该首先做同步ajax
我怀疑jQuery是在欺骗你。
我建议您尝试删除jQuery ajax调用,而不是放在一个常规的XMLHttpRequest对象。我可以向你保证它会起作用的。
jQuery -通过使事情复杂化来简化它们!我自己写代码,我很清楚的作用
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- jQuery自定义验证比较多个输入的序列
- 获取@ResponseBody的一部分作为主干和Spring MVC控制器之间的参数
- 反向字符串比较
- 通过JSON&比较时间
- 将DOM节点值与字符串Javascript进行比较
- 如何检查字符串的一部分与数组匹配
- 为什么可以't我使用了AJAX响应的一部分
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 递归深度比较
- 仅重新加载网页的一部分
- 如何使用ViewCompiler手动编译DOM的一部分
- 可以't在JavaScript中比较两个字符串
- Regex提取URL返回数组的一部分;未定义”;
- 将javascript变量与href的一部分进行比较
- Ajax函数作为javascript比较的一部分
- 比较javascript变量与2级导航条的一部分
- JQuery -只比较select输入中所有选项的一部分文本,并选择匹配的那个
- AngularJS过滤器问题:仅比较字符串的一部分(子字符串)