0

在 Javascript 对象 ( testObject) 中,我使用来自jQuery.getJSON回调函数的对象填充数组。该数组首先被定义为对象属性this.publicArrayvar passedArray = this并使内部回调函数能够访问公共对象。

使用对象的公共方法,我可以将填充数组的内容公开为对象的子属性,但不能直接公开数组的内容。

function testObject() {

  this.publicArray = [];
  var passedArray = this;

  $.getJSON('http://...',
    function(data) {
      passedArray.publicArray = [{key:'value'},{key:'value'},{key:'value'}]  
  });

  this.testMethod = function() {
    console.log(this);
    console.log(this.publicArray);
  };
}

myObject = new testObject(); // [1]
myObject.testMethod(); // [2]

返回:

 [1] > thisArray: Array[3]
         0: Object
           key: "value"
         1: Object
           key: "value"
         2: Object
           key: "value"
         length: 3

 [2] > []

如果我用完全相同的对象而不是从回调函数填充数组,它的行为与我期望的一样,所以我不明白:

  1. 如何从对象方法访问数组的内容
  2. 为什么数组内容对开发人员工具可见而不是我的脚本。

谢谢 - 请随时就我搞砸的任何其他事情对我进行教育。

4

2 回答 2

1

Ajax 是异步的。回调发生在新实例创建后的一段时间内。

尝试这样的事情。当数据准备好被操作时,会发生 onReady 回调(未测试):

function testObject() {

    this.itsArray = [];
    var passedArray = this;

    var request = $.getJSON('http://...', function(data) {
        passedArray.itsArray = [
            {
            key: 'value'},
        {
            key: 'value'},
        {
            key: 'value'}
        ];
    });

    this.testMethod = function() {
        console.log(this);
        console.log(this.itsArray);
    };
    this.onReady = function(fn) {
        request.done(fn)
    };
}

var myObject = new testObject(); // [1]
// the following can be used multiple times
myObject.onReady(function() {
    myObject.testMethod(); // [2]
});​
于 2012-06-18T18:02:26.523 回答
1

您尝试执行的操作存在一些问题。

一方面,当您创建“testObject”的新实例时,您正在发出一个 ajax 请求来填充数组属性“itsArray”。在 ajax 请求完成之前,此属性将具有其默认值 ([])。

因为 AJAX 默认是异步的(这意味着代码将执行你的 'getJSON' 调用并立即继续下一条语句),任何对 'testMethod' 的调用都将返回一个空数组,直到 ajax 请求完成。

您可以做的是使用 ajax 请求返回的“承诺”(Jquery Deferred Objects)并等待承诺得到解决,如下所示:

function testObject() {

  this.itsArray = [];
  var passedArray = this;

  this.getJSONPromise = $.getJSON('http://...',
    function(data) {
      passedArray.itsArray = [{key:'value'},{key:'value'},{key:'value'}]  
  });

  this.testMethod = function() {
    console.log(this);
    console.log(this.itsArray);
  };
}

现在我们有了一个可以使用的“promise”对象,我们可以等待它完成来调用 testMethod 并且我们将拥有我们的数据。

myObject = new testObject();
$.when(myObject.getJSONPromise).then(function()
{
    myObject.testMethod();
});
于 2012-06-18T18:08:54.633 回答