用于在Javascript中生成多个XML请求的循环

时间:2012-10-03 17:53:06

标签: javascript xml for-loop xml-parsing xmlhttprequest

我需要访问一系列XML文档,并尝试使用for循环来动态生成每个请求:

for (i=0;i<routes.length;i++) {
routeRequestURL = "http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=" + routes[i].name + "&terse";
routeRequest.open("GET", routeRequestURL);
routeRequest.send();
routeResponse = routeRequest.responseXML;
route = routeResponse.getElementsByTagName("route")[0];
for (var j = 0; j < route.childNodes.length; j++) {
    if (route.childNodes[j].tagName == "stop") {
        routes[i].stops.push(new Stop(route.childNodes[j].getAttribute("tag"), route.childNodes[j].getAttribute("lat"), route.childNodes[j].getAttribute("lon")));
    }
  }
}

routesroute个对象的数组,它有三个变量:namelabelstops,它本身就是一个{ {1}}对象。

我在Chrome的javascript控制台中尝试了代码,当我使用stop在外部循环中运行每一行时,它都能正常工作。当我尝试在控制台中运行循环时,收到以下错误消息:routes[0]

如果使用TypeError: Cannot call method 'getElementsByTagName' of null运行每行代码都不会产生错误,那么为什么在for循环的第一次迭代期间routes[0]为空?我在某个地方错过了关闭错误吗?

编辑:我尝试添加routeResponse回调,但是,对javascript不熟悉,无法弄清楚如何做到这一点。我试过了:

readystatechange

它不起作用。

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 在您添加的readystatechange回调中,您必须检查回复是否已完成加载
  2. 回调引入了一个闭包,这会导致您对i
  3. 的引用出现问题

    以下代码应解决这两个问题:

    routeRequest.onreadystatechange = (function(i) { return function() {
        if(routeRequest.readyState == 4 && routeRequest.status == 200) {
            routeResponse = routeRequest.responseXML;
            route = routeResponse.getElementsByTagName("route")[0];
            for (var j = 0; j < route.childNodes.length; j++) {
                if (route.childNodes[j].tagName == "stop") {
                    routes[i].stops.push(new Stop(route.childNodes[j].getAttribute("tag"), route.childNodes[j].getAttribute("lat"), route.childNodes[j].getAttribute("lon")));
                }
            }
         }
    }})(i);