getJSON并发覆盖变量


getJSON concurrency overwritting variables?

我的javascript页面遇到了很多问题。

基本上,我有一个从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;,因为当使用new调用函数时,this将自动返回。

当您使用new调用函数时,JavaScript会创建一个新对象,该对象继承自ArticleObject.prototype,并且在函数this中指向该新实例。当您在没有new的情况下调用函数时,JavaScript会将this设置为window,因此每次运行函数时,它只会更新window上的相同属性。

有关使用new的更多信息,请阅读MDN对此的介绍。