以下代码中的两个警报函数返回不同的结果。我也试图让第二个评估真实..任何帮助表示赞赏..谢谢..
var array;
$.get('php/getstocklist.php', function(data){
array = data;
alert($.isArray(array)); //alerts true
}, "json");
alert($.isArray(array)); //alerts false
以下代码中的两个警报函数返回不同的结果。我也试图让第二个评估真实..任何帮助表示赞赏..谢谢..
var array;
$.get('php/getstocklist.php', function(data){
array = data;
alert($.isArray(array)); //alerts true
}, "json");
alert($.isArray(array)); //alerts false
问题是它$.get
是异步的。var 是全局的,就像你现在拥有的一样。它只是没有定义,因为您的第二个警报在 ajax 返回并运行其成功回调之前立即运行。
为了在回调之外使用它,您需要轮询一个变量以确保已分配结果...但是您实际上是在使用假回调,因此重组代码并正常执行更有意义方法 :-)
这是正在发生的事情:
// 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 是一种繁重的异步语言。您必须摆脱过程思维,而是考虑传递一些代码以便稍后执行(那些是回调)。
如果我理解你为什么不能
$.getJSON('php/getstocklist.php', function(data){
dosomething(data);
});
function dosomething(data) {}
第二个警报在第一个警报之前执行,因为 $.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 调用返回时触发。
它有点不合时宜,但尝试设置使用它会将您的变量从请求中分离出来并使其成为全局
window.array = data;
alert($.isArray(window.array));