我有简单的AJAX函数,它使用jQuery从数据库返回300个测试对象的数组。我可以看到返回的数据,我可以使用FireBug逐步完成第一个循环并进入构造函数。
此数据被复制到JS数组。代码片段如下所示:
//retrieve star locations to display on page
$.getJSON("stars.php?jsoncallback=?", function(data) {
for (var x=0, xx=data.length; x<xx; x++) {
// planetArray[x] = new Planet(data[x].xpos, data[x].ypos); // also doesn't work.
planetArray.push(new Planet(data[x].xpos, data[x].ypos));
}
});
for (var i=0, ii=planetArray.length; i<ii; i++) {
// display the data.
}
FireBug说planetArray.length
为零。 Planet
构造函数如下所示:
function Planet(x, y) {
this.x = x;
this.y = y;
}
我认为这是一个范围问题,但我似乎无法弄明白。在其他语言中,创建一个新对象意味着它存在于堆上并在范围内存活,但在这里它似乎消失在以太中。
如何返回一个数组并将其推入我自己的数组中以供以后使用(甚至在另一个函数中使用)?
答案 0 :(得分:6)
AJAX请求以异步方式发生 - 在尝试显示数据之前,您并没有等待它完成。
将显示代码移动到回调中,它应该可以工作。
答案 1 :(得分:1)
如果您在示例代码之前添加planetArray = [];
,则会有所帮助。
答案 2 :(得分:1)
实际上只是赞美两个答案 就像Greg说它异步工作意味着当第二部分(//显示数据循环)被执行时,请求还没有回来,所以数组没有被填充。
var planetArray = [];
//retrieve star locations to display on page
$.getJSON("stars.php?jsoncallback=?", function(data) {
for (var x = 0; x < data.length; x++) {
planetArray.push(new Planet(data[x].xpos, data[x].ypos));
}
for (var i = 0; i < planetArray.length; i++) {
// exectutes after part below
// data already filled
}
});
for (var i = 0; i < planetArray.length; i++) {
// NO DATA YET
}