javascript - 多个 xmlhttp 请求 - JSON get 被覆盖

标签 javascript json xmlhttprequest

我必须执行多个 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();
}

我寻找了 Promise 语法,但我不确定在这种情况下如何使用它,并且我尝试了多种方法,但无法让它工作。 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所以你没有使用你的xmlhttp变量直接在onreadystatechange中被覆盖后的处理程序:

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();
}

关于javascript - 多个 xmlhttp 请求 - JSON get 被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32323068/

相关文章:

javascript - 设置配置?

json - Azure 将 XML 转换为 JSON

json - 如何在 Angular 8 中将 json 字符串转换回对象

javascript - 如何使用 XMLHttpRequest 将数据从客户端 Javascript 传递到 node.js?

php - 使用 XHR 进度事件监控 MySQL 查询

javascript - 使用 ramda 过滤掉唯一的嵌套值

javascript - 从文件上传读取 url 时图像自动旋转(当它是大图像时)?

java - 在 HttpURLConnection 中,为什么 JSONObject 作为 Params 不起作用,但 String 作为 Params 起作用

javascript - 如何从需要基本身份验证的 URL 获取 src

javascript - Firebase 自动删除功能在 2 小时后要求删除时以秒为单位删除元素