使用多个网址

时间:2017-03-24 04:43:06

标签: 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 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,我将非常感激。

2 个答案:

答案 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循环中的结果数组的长度,否则会阻塞线程并使一切都更糟糕。