【问题标题】:Promote callback onSuccess return value to the Caller Function return value将回调 onSuccess 返回值提升为 Caller Function 返回值
【发布时间】:2009-04-20 14:17:02
【问题描述】:

我有一个 javascript 函数,它调用一个通用函数来对服务器进行 ajax 调用。我需要从 ajax 调用的回调函数中检索结果(真/假),但我得到的结果始终是“未定义”。

没有我所有逻辑的通用函数的超级简化版本是:

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();
        }
    }

“结果”变量始终是“未定义”,调试它我可以看到正在执行回调函数的“返回真”行。

对为什么会发生这种情况有任何想法吗?我如何冒泡将回调函数的返回值传递给 CallServer 函数?

谢谢

【问题讨论】:

    标签: javascript ajax jquery


    【解决方案1】:

    以防万一您想采用异步方式(这是一个更好的解决方案,因为它不会在执行请求时冻结您的浏览器),下面是代码:

    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();
            }
        });
    }
    

    【讨论】:

    • 我的函数必须是同步的,但我不知道返回值的方式有时可能有用,所以谢谢!
    【解决方案2】:

    我通常将任何要在成功时执行的代码放在回调函数本身中。我不认为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 调用)。如果是这样,请对此答案投反对票并发表评论,我将删除此答案。

    【讨论】:

    • Calvin 的答案没有错;) 问题是它是一个完全通用的函数,用于验证目的,所以我不能把代码放在那里,如果验证通过了该怎么办。我需要以某种方式让 Callserver 返回布尔值。反正干杯
    【解决方案3】:

    刚刚找到怎么做:) 声明一个变量并从回调函数中相应地更新它。之后我可以返回该变量。我将代码放置给未来的读者:

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

    【讨论】:

    • 虽然这可能对您有用,但它是不可预测的代码,因为您可能会在异步 POST 设置其值之前从 CallServer 返回“returnValue”。经验法则:不要在同步包装器中包装异步调用!
    • 您可能会查看 $.when 来寻找等待异步调用的方法 api.jquery.com/jQuery.when
    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2020-09-19
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多