4

可能重复:
如何让 jQuery 执行同步而不是异步的 AJAX 请求?
ajax完成后获取变量

以下代码中的两个警报函数返回不同的结果。我也试图让第二个评估真实..任何帮助表示赞赏..谢谢..

var array;

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

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

  }, "json");

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

5 回答 5

1

问题是它$.get是异步的。var 是全局的,就像你现在拥有的一样。它只是没有定义,因为您的第二个警报在 ajax 返回并运行其成功回调之前立即运行。

为了在回调之外使用它,您需要轮询一个变量以确保已分配结果...但是您实际上是在使用假回调,因此重组代码并正常执行更有意义方法 :-)

于 2012-08-03T16:36:27.027 回答
0

这是正在发生的事情:

// 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 是一种繁重的异步语言。您必须摆脱过程思维,而是考虑传递一些代码以便稍后执行(那些是回调)。

于 2012-08-03T16:32:59.447 回答
0

如果我理解你为什么不能

$.getJSON('php/getstocklist.php', function(data){  
    dosomething(data);
});


function dosomething(data) {}
于 2012-08-03T17:05:52.133 回答
0

第二个警报在第一个警报之前执行,因为 $.get 回调异步执行。如果您希望第二个警报返回 true,您应该使用jQuery Deferred 对象,如下所示:

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

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

于 2012-08-03T16:43:47.683 回答
-3

它有点不合时宜,但尝试设置使用它会将您的变量从请求中分离出来并使其成为全局

window.array = data;  

alert($.isArray(window.array));
于 2012-08-03T16:33:24.193 回答