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

时间:2011-11-14 15:06:58

标签: javascript ajax jquery

我遇到了一个问题,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根本不适合这个过程。

3 个答案:

答案 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 - 通过使它们复杂化来简化事物!我编写自己的代码,我知道 完全 它的作用。