我需要解析几个JSON文件,提取不同的值然后比较这些值。我在收到多个JSON文件时遇到了麻烦......我认为" request.onload"只能在for循环中使用一次,所以也许这就是原因。
var myArray = [7138, 6237];
for (i = 0; i < myArray.length; i++) {
//var id = 55;
var head = "https://developer.trimet.org/ws/V2/arrivals/locIDs/";
var tail = "/appID/30BE7218095886D573C04A41C/xml='true'";
var url = head + myArray[i] + tail;
//console.log(url);
var request = new XMLHttpRequest();
request.open('GET', url);
request.responseType = 'json';
request.send();
request.onload = function() {
var arrivalData = request.response;
console.log(arrivalData.resultSet);
}}
解释代码:数组&#34; myArray&#34;包含两个公共汽车站ID,与另一段代码一起找到(我正在制作小应用程序以找到最近的10个公共汽车站,然后告诉用户在下一班公共汽车到达每个公共汽车站之前多久。为了测试它,我我只是使用两个常量ID)。这些ID被插入到一个URL中,该URL包含一个JSON脚本,详细说明了该公共汽车站的公交时刻表。
我想提取JSON并将其作为单独的JSON保存在代码中。我认为现在的代码现在这样做,但它似乎只工作一次。最后,for循环会将到达时间添加到一个数组中,这些时间将被比较以查看哪一个更快到来,然后将找到最快的到达时间及其相应的总线停止ID。最后,我想让这个功能可以使用任何一组公交车站点ID,这样我就可以找到任何公交车站的最快公交车到达时间。
如果你想看看到达次,您可以转到网址链接并查看JSON - 到达时间可以是&#34;估计&#34;或&#34;预定&#34;从1970年1月1日开始,这些值以毫秒为单位。
如果有人可以帮助我只能访问request.onload函数之外的JSON,我将非常感激。
答案 0 :(得分:1)
XMLHttpRequest以异步方式工作。并且for循环是同步的。所以你面对这个问题。我认为下面的代码解决了你的问题
var myArray = [7138, 6237];
myArray.forEach(function (id) {
//var id = 55;
var head = "https://developer.trimet.org/ws/V2/arrivals/locIDs/";
var tail = "/appID/30BE7218095886D573C04A41C/xml='true'";
var url = head + id + tail;
//console.log(url);
var request = new XMLHttpRequest();
request.open('GET', url);
request.responseType = 'json';
request.send();
request.onload = function() {
var arrivalData = request.response;
console.log(arrivalData.resultSet);
}
})
答案 1 :(得分:1)
添加作为答案
var myArray = [7138, 6237];
//Define results globally
var results = [];
for (i = 0; i < myArray.length; i++) {
//var id = 55;
var head = "https://developer.trimet.org/ws/V2/arrivals/locIDs/";
var tail = "/appID/30BE7218095886D573C04A41C/xml='true'";
var url = head + myArray[i] + tail;
//console.log(url);
var request = new XMLHttpRequest();
//Move here so onload event is registered
request.onload = function() {
var arrivalData = request.response;
results.push(arrivalData.resultSet);
};
request.open('GET', url);
request.responseType = 'json';
request.send();
}
虽然这应该有用,但我认为您的问题可以通过承诺来解决,它会使您的代码更容易理解。
阅读promise api,尤其是Promise.All()。
修改强>
只是关于该请求数组的注释,因为如果在运行for循环后尝试直接访问结果数组,则XMLHttpRequest和onload是异步的,它将为空。这是承诺如此强大的原因之一。
使用当前的方法,您无法知道两个请求何时完成,除非您不断检查while循环中的结果数组的长度,否则会阻塞线程并使一切都更糟糕。