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

ant*_*ioh 6 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;
            }
    });
}
Run Code Online (Sandbox Code Playgroud)

调用它的函数将是这样的:

function Next() {
        var result = CallServer("/Signum/TrySave");
        if (result == true) {
            document.forms[0].submit();
        }
    }
Run Code Online (Sandbox Code Playgroud)

"result"变量总是"未定义",调试它我可以看到正在执行回调函数的"return true"行.

有关为什么会发生这种情况的任何想法?我怎样才能将返回值从回调函数冒泡到CallServer函数?

谢谢

Vin*_*ert 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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


ant*_*ioh 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管这可能对您有用,但它是不可预测的代码,因为您可能会在异步 POST 设置其值之前从 CallServer 返回“returnValue”。经验法则:不要将异步调用包装在同步包装器中! (10认同)