将回调onSuccess返回值提升为Caller Function返回值

时间:2009-04-20 14:17:03

标签: javascript ajax jquery

我有一个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函数的返回值?

由于

3 个答案:

答案 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;
}