多个xmlhttp请求-覆盖JSON get's

Multiple xmlhttp requests - JSON get's overwritten

本文关键字:get JSON xmlhttp 请求 覆盖 多个      更新时间:2023-09-26

我必须做多个xmlhttp请求(每个国家一个)。问题是我的JSON总是被覆盖到最后一个请求的结果。我有什么办法可以补救吗?代码如下:

function getDataBetween()
{
    for (var i = 0; i < CountryNames.length; i++) 
    {
        var countryName = CountryNames[i];
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200) 
            {
                for (var a = 0; a < CountryNames.length; a++) 
                {
                    dataset[a] = JSON.parse(xmlhttp.responseText);
                    console.log(dataset[a]);
                }
            }
        }
        xmlhttp.open("GET","update.php?country=" + countryName + "&begin=" + beginTime + "&end=" + endTime + "&functionName=getActiveUsers", true);
        xmlhttp.send();
    }
    DrawStructure();
}

我一直在寻找承诺语法,但我不确定如何在这种情况下使用它,我尝试过很多事情,但我不能让它工作。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

您需要为每个请求跟踪单独的xmlHttpRequest对象。现在,您的for循环使用相同的变量来存储所有变量,因此后面的变量覆盖后面的变量。有很多方法可以解决这个问题。一种方法是添加闭包,这样每次调用for循环都有自己的函数作用域:

function getDataBetween()
{
    for (var i = 0; i < CountryNames.length; i++) 
    {
        (function() {
            var countryName = CountryNames[i];
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) 
                {
                    for (var a = 0; a < CountryNames.length; a++) 
                    {
                        dataset[a] = JSON.parse(xmlhttp.responseText);
                        console.log(dataset[a]);
                    }
                }
            }
            xmlhttp.open("GET","update.php?country=" + countryName + "&begin=" + beginTime + "&end=" + endTime + "&functionName=getActiveUsers", true);
            xmlhttp.send();
        })();
    }
    DrawStructure();
}

您也可以将对xmlhttp的引用更改为对this的引用,这样您就不会在覆盖onreadystatechange处理程序后直接使用xmlhttp变量:

function getDataBetween()
{
    for (var i = 0; i < CountryNames.length; i++) 
    {
        var countryName = CountryNames[i];
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange=function()
        {
            if (this.readyState==4 && this.status==200) 
            {
                for (var a = 0; a < CountryNames.length; a++) 
                {
                    dataset[a] = JSON.parse(this.responseText);
                    console.log(dataset[a]);
                }
            }
        }
        xmlhttp.open("GET","update.php?country=" + countryName + "&begin=" + beginTime + "&end=" + endTime + "&functionName=getActiveUsers", true);
        xmlhttp.send();
    }
    DrawStructure();
}