【问题标题】:Returned AJAX array not being copied to array返回的 AJAX 数组未复制到数组
【发布时间】:2009-12-08 14:24:35
【问题描述】:

我有一个简单的 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;
}

我认为这是一个范围界定问题,但我似乎无法弄清楚。在其他语言中,创建新对象意味着它存在于堆中并在范围内存活,但在这里它似乎消失在以太中。

如何返回一个数组并将其推送到我自己的数组中以供以后使用(甚至在另一个函数中)?

【问题讨论】:

    标签: javascript jquery ajax arrays


    【解决方案1】:

    AJAX 请求是异步发生的 - 您无需等待它完成就可以尝试显示数据。

    将显示代码移动到回调中,它应该可以工作。

    【讨论】:

    • 但是如果我想在代码的其他地方使用该数组怎么办?如何保证数据已加载?一种技术含量较低的方法是检查“planetArray.length > 0”,但即使这样也可能有问题。
    • 好吧,如果它是 onload 操作,那么您应该将所有内容都放在 Ajax 回调中。否则创建 bool/timestamp 变量来保持负载状态。
    【解决方案2】:

    如果您在示例代码之前添加planetArray = []; 应该会有所帮助。

    【讨论】:

    • 为简洁起见省略了。其实我用的是var planetArray = new Array();,但都是一样的。
    【解决方案3】:

    实际上只是合并两个答案。
    就像 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
    }    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      相关资源
      最近更新 更多