在带有多个URL的javascript中添加JSON

在带有多个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

我需要解析几个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);

}}
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)方法