Ajax函数作为javascript比较的一部分

Ajax function as part of a javascript comparison

本文关键字:比较 一部分 javascript 函数 Ajax      更新时间:2023-09-26

我遇到了一个问题,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 -通过使事情复杂化来简化它们!我自己写代码,我很清楚的作用