关于jquery:如何在调用$ .get方法时使javascript变量全局?

How to make a javascript variable global when called the $.get method?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How can I get jQuery to perform a synchronous, rather than asynchronous, AJAX request?
Get a variable after ajax done

以下代码中的两个警报函数返回不同的结果。我也在试着让第二个评价为真。感谢您的帮助。谢谢。。

1
2
3
4
5
6
7
8
9
10
var array;

  $.get('php/getstocklist.php', function(data){  

  array = data;
  alert($.isArray(array));    //alerts true

  },"json");

alert($.isArray(array));      //alerts false


问题是$.get是异步的。VaR和现在一样是全局的。它只是没有定义,因为在Ajax返回并运行其成功回调之前,第二个警报会立即运行。

为了在回调之外使用它,您需要轮询一个变量以确保已分配结果…但是,实际上您使用的是一个假的回调,因此重新构造代码并按正常方式执行更为合理:-)


如果我理解你的话,为什么你不能

1
2
3
4
5
6
$.getJSON('php/getstocklist.php', function(data){  
    dosomething(data);
});


function dosomething(data) {}


第二个警报在第一个警报之前执行,因为$.get回调是异步执行的。如果希望第二个警报返回true,则应使用jquery延迟对象,如下所示:

1
2
3
4
5
6
7
8
9
10
11
var array;

deferred = $.get('php/getstocklist.php', function(data){  

  array = data;
  alert($.isArray(array));    //alerts true

},"json");

// alerts true if $.get succeeded
deferred.done(function () { alert($.isArray(array)); });

当异步$.get调用返回时,传递给done的回调将触发。


以下是发生的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// This variable _is_ global. However, it's current value is undefined
var array;

$.get('php/getstocklist.php', function(data){  

  // After this runs, _now_ array has data in it
  array = data;

  // thus causing $.isArray to return true here.
  alert($.isArray(array));    //alerts true

},"json");

// This call happens BEFORE the callback to the $.get call,
// so as of this line, array is still undefined, which results in
// the $.isArray call returning false.
alert($.isArray(array));      //alerts false

JavaScript是一种重异步语言。您必须从过程思维中解脱出来,转而考虑传递代码位以便稍后执行(这些是回调)。


这有点不靠谱,但是尝试使用设置,这样可以将变量从请求中分离出来,并使其成为全局变量。

1
2
3
window.array = data;  

alert($.isArray(window.array));