2012-07-15 88 views
0

我在使用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存在问题。

有关如何解决此问题的任何想法?

回答

1

改变这一行:

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的更多信息。