我有一个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;
}
答案 0 :(得分:2)
我没有看到范围问题。您getJSON
的成功函数在mainFunction
中定义,因此可以访问s
。 mainFunction
被定义为person
的对等方,因此可以访问它。
我上午看到同步/异步问题。以下是mainFunction
的执行顺序:
ArrayCollection
。$.getJSON
发起数据请求。ArrayCollection
(Knud Mikkelsen)getJSON
调用完成并将人物对象添加到ArrayCollection
这是因为默认情况下,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);