在带有多个URL的javascript中添加JSON
我需要解析几个JSON文件,提取不同的值,然后比较这些值。但是,我很难显示多个JSON文件……我认为“request.onload”在for循环中只工作一次,所以这可能就是原因在带有多个URL的javascript中添加JSON,javascript,jquery,json,mapbox,Javascript,Jquery,Json,Mapbox,我需要解析几个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
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);
}}
var myArray=[71386237];
对于(i=0;i
代码解释:数组“myArray”包含两个公交站点ID,它们可以通过另一段代码找到(我正在制作一个小应用程序,查找最近的10个公交站点,然后告诉用户下一辆公交车到达每个公交站点的时间。为了测试它,我只使用了两个常量ID)。这些ID被插入到一个url中,该url包含一个JSON脚本,详细说明该公交车站的公交时刻表 我想提取JSON并将其保存为代码中单独的JSON。我认为当前的代码现在可以做到这一点,但它似乎只工作一次。最后,for循环将把到达时间添加到一个数组中,比较这些时间,看哪一个来得更快,然后找到最早的到达时间及其对应的公交站点ID。最后,我想让它成为一个函数,可以接受任意一组公交站点ID,这样我就可以找到任意一组公交站点的最快到达时间。如果你想查看到达时间,你可以转到url链接并查看JSON-到达时间可以是“估计”或“计划”自1970年1月1日起,数值以毫秒为单位 如果有人能帮助我在request.onload函数之外访问JSON,我将非常感激 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);
}
})
也加上一个答案
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();
}
var myArray=[71386237];
//全局定义结果
var结果=[];
对于(i=0;i
虽然这应该是可行的,但我认为您的问题可以通过承诺来解决,这将使您的代码更易于理解
请仔细阅读,尤其是Promise.All()
编辑
请注意该请求数组,因为XMLHttpRequest和onload是异步的,如果在运行for循环后直接尝试访问结果数组,它将是空的。这就是承诺如此强大的原因之一
使用当前方法,您无法知道两个请求何时完成,除非您在while循环中不断检查结果数组的长度,这会阻塞线程,使事情变得更糟。您正在为数组的每个循环创建一个新的XMLHttpRequest对象,因此每个循环的onload事件都是独立的。尝试在request.open()之前定义onload函数。发件人:注意:在对请求调用open()之前,需要添加事件侦听器。否则将不会触发进度事件。在函数似乎正常工作后移动request.send()。如何将每个JSON的某些属性添加到数组中?如果您知道对象将具有哪些属性,则可以在全局范围内定义一个数组,然后使用array.push(object.property)方法