一連の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")));
}
}
}
routes
はroute
オブジェクトの配列であり、3つの変数、、、、name
およびlabel
がありstops
、それ自体がstop
オブジェクトの配列です。
Chromeのjavascriptコンソールでコードを試してみましたが、外側のループ内の各行を。で実行すると機能しましたroutes[0]
。コンソールでループを実行しようとすると、次のエラーメッセージが表示されましたTypeError: Cannot call method 'getElementsByTagName' of null
。
コードの各行をroutes[0]
エラーなしで実行する場合routeResponse
、forループの最初の反復中にnullが発生するのはなぜですか?どこかでクロージャエラーがありませんか?
編集:私はコールバックを含めようとしましたreadystatechange
が、javascriptに慣れていないため、それを行う方法を完全に理解することができませんでした。私は試した:
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.onreadystatechange = function() {
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")));
}
}
}
routeRequest.send();
}
うまくいきませんでした。