getJSON并发覆盖变量?
问题描述:
我在使用javascript页面时遇到了很多麻烦。getJSON并发覆盖变量?
基本上,我有一个从PHP页面获取数据的html/javascript页面。我多次这样做,将它们推入数组,然后显示数组。
下面的代码的破败
var spawnedNewspaper = [];
var articlesToSpawn = null;
$("#generate").click(function() {
spawnNewspaper();
});
function spawnNewspaper(){
if(itemsToSpawn==null){
articlesToSpawn = 4;
spawnedNewspaper = [];
}
if(itemsToSpawn > spawnedNewspaper.length)
spawnAnItem();
if(itemsToSpawn == spawnedNewspaper.length){
itemsToSpawn = null;
// ... display the results
}
}
function spawnAnItem(nationalDexID, level, generateRandomBerry, generateRandomTMItem, generateRandomItem, knowsRandomTM, imageURL){
$.getJSON("...url.../spawner_json.php?jsoncallback=?" ,
{
dataitename: data
}
, spawnAnArticlePart2
);
}
function spawnAnArticlePart2(data){
//returning from spawnAnItem callback
p = ArticleObject(data.heading, data.date, data.author)
spawnedNewspaper.push(p);
spawnNewspaper();
}
function ArticleObject(heading, date, author){
this.heading = heading;
this.date = date;
this.author = author;
return this;
}
所以,它的完成后,它显示我的数组是正确数量的文章,但每篇文章都是完全一样的,当我知道它生成的每个独特的东西时间。
我的想法是有一个并发问题,并且事情正在被覆盖(我使用push(),所以这很奇怪),或者说我的ArticleObject存在问题。
有关如何解决此问题的任何想法?
答
改变这一行:
p = ArticleObject(data.heading, data.date, data.author)
要使用new
操作:
p = new ArticleObject(data.heading, data.date, data.author)
然后你ArticleObject()
函数中你不需要说return this;
因为this
时,将自动返回函数调用new
。
发生了什么事是,当你调用与new
的JavaScript函数创建一个新对象,从ArticleObject.prototype
和函数中this
点继承到新的实例。当您调用没有new
的函数时,JavaScript将this
设置为window
,因此每次函数运行时它都会更新window
上的相同属性。
有关使用new
阅读what MDN has to say about it的更多信息。