如何将数据从ajax请求传递到全局变量?

时间:2010-10-07 23:30:53

标签: jquery ajax variables get

确定。我完全不知所措。这是代码:

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

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

根据我的评论,newToken的第一个警告是“垃圾”(junk.php的唯一输出)。一旦超出.get,newToken将恢复为“1”。我需要将此变量设置为junk.php的输出。这不可能吗?我尝试了一切,到处搜寻。

感谢。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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()

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

一些例子:

newToken

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

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

jsFiddle example

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

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