无法在jQuery的getJSON数据函数中向Array添加对象(范围问题)

时间:2010-05-06 08:19:56

标签: javascript jquery scope

我有一个person对象,并希望将它存储到我所创建的全局ArrayCollection中。 在正常范围内工作得很好:

var s = new ArrayCollection();
s.add(new person("Knud", "Mikkelsen", 35));

问题是当我想在我的jQuery函数“mainFunction”中添加人员时。

我似乎无法做对。我知道它与范围有关,我必须在像我的ArrayCollection中的函数中包装一些东西。 请帮助我 - 非常感谢。

function ArrayCollection() {
 var myArray = new Array;
 return {
  empty: function () {
   myArray.splice(0, myArray.length);
  },
  add: function (myElement) {
   myArray.push(myElement);
  },
  getAll: function () {
   return myArray;
  }
 }
}

function person(firstName, lastName, age) {
 this.firstName = firstName;
 this.lastName = lastName;
 this.age = parseInt(parseFloat(age));
}

function mainFunction() {
 //....
 var s = new ArrayCollection();
 s.add(new person("Knud", "Mikkelsen", 35));

 $.getJSON(url, function (data) {
  for (var x = 0; x < data.length; x++) {

   var myPerson = new person(data[x].FirstName.toString(), data[x].LastName.toString(), data[x].Age.toString());
   s.add(myPerson);
  }
 });

 alert(drawArray(s.getAll()));
}

function drawArray(myArray) {
 var v = "";
 for (var i = 0; i < myArray.length; i++) {
  v += myArray[i].firstName + " " + myArray[i].lastName + " (" + myArray[i].age + ")\n";
 }
 return v;
}

1 个答案:

答案 0 :(得分:2)

我没有看到范围问题。您getJSON的成功函数在mainFunction中定义,因此可以访问smainFunction被定义为person的对等方,因此可以访问它。

上午看到同步/异步问题。以下是mainFunction的执行顺序:

  1. 创建新的ArrayCollection
  2. 添加一个名为Knud Mikkelsen的人
  3. 通过$.getJSON发起数据请求。
  4. 警告显示ArrayCollection(Knud Mikkelsen)
  5. 中的一个人
  6. 返回
  7. 在将来的某个时刻,getJSON调用完成并将人物对象添加到ArrayCollection
  8. 这是因为默认情况下,getJSON 异步 - 它在将来的某个时刻完成,而不是与启动它的代码同步。这是一件好事,因为同步Ajax调用会完全锁定浏览器UI并导致糟糕的用户体验。

    实际看到Ajax调用返回的那个人的选项是将警报移动到getJSON成功处理程序内,和/或将回调传递给由mainFunction触发的getJSON {1}}完成功能,和/或传递ArrayCollection以添加到mainFunction中,稍后只需检查新人物对象作为程序流程的一部分。

    以下是一些选项:

    只需移动alert完成功能中的getJSON

    function mainFunction() {
        //....
        var s = new ArrayCollection();
        s.add(new person("Knud", "Mikkelsen", 35));
    
        $.getJSON(url, function (data) {
            for (var x = 0; x < data.length; x++) {
                var myPerson = new person(data[x].FirstName.toString(), data[x].LastName.toString(), data[x].Age.toString());
                s.add(myPerson);
            }
            alert(drawArray(s.getAll())); // <== moved this into the completion function
        });
    }
    

    或使用回调:

    function mainFunction(callback) {
        //....
        var s = new ArrayCollection();
        s.add(new person("Knud", "Mikkelsen", 35));
    
        $.getJSON(url, function (data) {
            for (var x = 0; x < data.length; x++) {
                var myPerson = new person(data[x].FirstName.toString(), data[x].LastName.toString(), data[x].Age.toString());
                s.add(myPerson);
            }
            callback(s);                // <== Trigger callback, passing in the collection
        });
    }
    
    function mainFunctionCallback(s) {
        alert(drawArray(s.getAll()));   // <== Moved out of `mainFunction` entirely
    }
    
    // Usage:
    mainFunction(mainFunctionCallback);