【问题标题】:How can I pass data from an ajax request to a global variable?如何将 ajax 请求中的数据传递给全局变量?
【发布时间】:2010-10-07 23:30:53
【问题描述】:

好的。我完全感到困惑。代码如下:

$(document).ready(function(){
var newToken = 1;

$.get("junk.php",
    function(newToken) {
        alert(newToken); // alerts "junk"
    });
alert(newToken); // alerts "1"
});

根据我的 cmets,newToken 的第一个警报是“垃圾”(junk.php 的唯一输出)。一旦在 .get 之外,newToken 将恢复为“1”。我需要将此变量设置为 junk.php 的输出。这不可能吗?我什么都试过了,到处找。

谢谢。

【问题讨论】:

    标签: jquery ajax variables get


    【解决方案1】:

    您正在使用用作参数的新 newToken 变量来隐藏第一个 newToken 变量:

    问题:

    $(document).ready(function(){
    var newToken = 1; // <== newToken number 1
    
    $.get("junk.php",
        function(newToken) { // <== This is newToken number 2.
                             //     since it's the first argument
                             //     in the get success function it will
                             //     be the data returned.
    
            alert(newToken); // <== Alerts the data returned. newToken number 1 is 
                             // shadowed, obscured, covered up...
        });
    alert(newToken);
    });
    


    解决方法...使用不同的名称,甚至是 arguments 数组:

    解决办法:

    $(document).ready(function(){
    var newToken = 1;
    
    $.get("junk.php",
        function() {  // <== don't shade newToken
                      //     you could use another variable name like "data"
                      //     but I decided to use the arguments array for kicks
    
            alert("Data is: " + arguments[0] + // <== junk
                  "\nNew Token is: " + newToken); // <== 1
        });
    alert(newToken); // alerts "1"
    });
    

    Info on $.get()

    请注意,如果您在 get 回调中更新 newToken,由于调用的异步性质,事情可能会变得很棘手。基本上,请注意,您在$.get() 的回调中编写的所有内容仅在请求完成时(稍后)才会执行,但$.get() 之后但在文档准备好的所有内容将立即执行,并且 get 回调将可以访问变量的状态,就像 doc ready 函数返回时一样......基本上,您可以给 newToken 一个初始值,然后在 get 回调中使用它,但其他任何事情都可能导致您不例外的结果。

    一些例子:

    $(document).ready(function(){
        var newToken = 1;
    
        $.get("junk.php",
            function() {
                newToken++;
                alert(newToken); // alerts 2, so far so good.
            });
        });
    

    $(document).ready(function(){
        var newToken = 1;
    
        $.get("junk.php",
            function() {
                newToken++;
                alert("get: " + newToken); // alerts 3 - this is the last alert
            });
    
        newToken++;
        alert("ready:" + newToken); // alerts 2 - 
                                    // this happens before the server responds
    });
    

    jsFiddle example

    【讨论】:

    • 我看到了。这是一件非常有趣的事情,尤其是因为我的笔记本电脑既是客户端又是服务器,并且通过 Internet 连接没有延迟。注释掉线性第二警报表明线性第一警报确实触发了第二个警报,并发出警报“3”。那么,这是不是说值在发生变化,但速度还不够快,无法被其他地方的程序使用?
    【解决方案2】:
    $(document).ready(function(){
        var newToken = 1;
    
        $.get("junk.php",
            function(data) {
                alert(newToken); 
            });
        alert(newToken); // alerts "1"
    });
    

    【讨论】:

    • 如果你没看到,Mark,这里的想法是即使在函数停止运行之后,你也可以从匿名函数中引用更广泛的范围变量。基本上,当您在其中声明另一个匿名函数时,在 domready 上运行的匿名函数变成了一个闭包。这意味着,即使 domready 函数在您 .get() 返回时已经停止运行,解释器仍然可以访问在其中创建的对象。您可能刚刚意识到,这是 Javascript 最强大的功能之一。
    • 不理解此代码更改。据我所知,newToken 从 .get 请求中的本地变为未定义。那没有用。
    • @Mark - 变化是函数中的参数名称从newToken 更改为data。 - 有关解释,请参阅我的回答 - @Jud - 你应该使用 var newToken = 1;... 为什么要污染全局命名空间?
    • @Peter,已修复。不知道为什么我首先删除它。
    • 应该是 .get 中的 alert(data) 吗?我不明白为什么 newtoken 会在那里被设置为垃圾......
    【解决方案3】:

    首先,您对newToken 的定义位于传递给$(document).ready() 的匿名函数的上下文中,因此它根本不是全局的。不过,我不认为这是真正的问题......

    更严重的是:对$.get 的调用是异步的,因此控制权会立即传递给您的alert(newToken) 语句,而无需等待http 请求完成或其回调运行。因此,任何依赖于在该调用中检索到的数据的代码都应该在其回调中运行。

    【讨论】:

    • 对不起,我应该说我也尝试在文档就绪函数的内部和外部声明变量。这很重要,我省略了。但是,它对问题没有影响。
    • @Mark - 在外部作用域中声明的变量可以从内部作用域访问(但反之不行)。 var x = 1; $(function() { alert(x); }); 会起作用。
    • 你指的是哪个alert(newToken)? OP中有2个。代码中后面的那个会立即触发。 get 回调中的那个第二次被触发( 而不是立即 )。但问题是函数回调中参数的名称。 -- 看我的回答
    【解决方案4】:

    我找到了答案 - 在 jQuery 网站上的所有地方(惊喜、惊喜),都埋在评论中。

    newToken = $.ajax({ type: "GET", url: "junk.php", async: false }).responseText;
    

    这解决了问题——因为它是异步的,需要设置为 false。这不能使用 jQuery.get() 来完成,但必须是 jquery.ajax,其中可以设置 async:false。

    使用这种格式的请求,newToken 可以在整个脚本中使用。希望这最终会帮助其他人。

    【讨论】:

    • 这不是问题。您将返回数据的变量名称设置为newToken,这会遮盖(掩盖)您设置的等于1的newToken。---请参阅我的答案。
    • 有两个问题。他用内部变量 true 来隐藏变量。而且,由于 .get() 的异步特性,警报首先发生。
    • @Peter 这不是问题吗?有用。我正在开发的应用程序现在可以工作了。有了这个代码。这就是我说它解决问题时的意思。
    • @DGM - 是的,我在回答中涵盖了这一点,甚至包括一个演示它的示例。 - 不清楚说the aler happens first,因为有 2 个警报。 .get() 回调之外的那个首先发生。 .get() 回调中的那个发生在第二个。
    • @Mark - 是的,它可以工作,但是你正在同步使用 AJAX,这基本上违背了目的。
    猜你喜欢
    • 2015-08-24
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2011-06-13
    相关资源
    最近更新 更多