我必须执行多个 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/