1

我一直在用这个把头撞到墙上。有人可以告诉我我做错了什么吗?

var foo = 100;

function loadData() {
   // this pops up a window that says it's 100
   alert(foo);  

   $.getJSON(myvars.constants.ajaxpath + "getsettings", function(data) {
      foo = 200;
      // this pops up a window that says it's 200
      alert(foo);
   });
   // this pops up a window that says it's 100
   alert(foo); 
}

我在 getJSON() 调用中设置全局变量的任何值仅在 getJSON() 调用中有效。一旦函数退出,全局变量就会恢复到之前的值。

如何在 getJSON() 调用中设置这个全局变量?我也尝试过使用 .success()、.complete() 等。我希望它保持设置为 200,而不是恢复到 100。

谢谢!

PS 显然我在 getJSON() 调用中使用全局变量做其他事情,但简单的变量设置是为了说明问题。

4

4 回答 4

1

您的...

foo = 200

...一旦 ajax 请求返回,就会被调用。所以这是在“最后一个”之后alert(foo)。完成此脚本的执行后,如果您弹出开发者控制台 (F12) 并输入foo,您应该会看到 200。

于 2012-08-25T06:04:19.900 回答
1

变量没有被设置,第三个也是最后alert一个只是在设置之前调用。

因为您使用的是异步 JSON 调用,所以执行不会是线性的。在大多数情况下,该代码将类似于:

var foo = 100;

function loadData() {
   // this pops up a window that says it's 100
   alert(foo);  

   // The call is sent at this point
   $.getJSON(myvars.constants.ajaxpath + "getsettings");

   // this pops up a window that says it's 100
   alert(foo); 
}

// Some time later, after the server responds, this function is actually run

function(data) {
   foo = 200;
   // this pops up a window that says it's 200
   alert(foo);
});

您可以简单地通过调用 alert 或foo在调用返回后显示来测试这一点,或者将 JSON 调用设置为同步,这将强制执行按照您的预期进行(但这是非常糟糕的做法)。

于 2012-08-25T06:06:41.973 回答
0

尝试这个

var foo = 100;

function loadData() {

   alert(foo);  
   $.ajax({
      async: false,
      url: myvars.constants.ajaxpath + "getsettings",
      dataType: "json",
      success: function(data) {
      foo = 200;
      alert(foo);
   }
 });
  alert(foo); 
} 
于 2012-08-25T06:42:36.957 回答
0

这里你设置了成功事件的回调,当ajax请求成功完成时会调用这个回调。

$.getJSON(myvars.constants.ajaxpath + "getsettings", function(data) {
  foo = 200;
  alert(foo);
});

警告 foo 的最后一行是较早执行的。所以在ajax请求之后你的变量将是200。

于 2012-08-25T06:01:22.157 回答