連続XMLHttpRequest
javascriptをつかって,数回連続でAPI(ニコニコ動画API)にアクセスしようとしたところ上手くいかなかった.
while(i<3){ var XMLobj = new XMLHttpTequest(); url = "http://hogehoge" + i; XMLobj.open("GET",url); XMLobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); XMLobj.onreadystatechange = function() { if(XMLobj.readyState == 4 && XMLobj.status == 200){ Application.console.log(XMLobj.responseText); } } i++; }
※アドオンなのでApplication.console.logでコンソールに書き出してる
こんなカンジのを書いてたところ3回目のループの部分しかAPIの情報を取得できなかった.
原因を探ったところ,
XMLobj.readyState == 4 を満たしていない事がわかった.
そもそもコイツが4を指すのは読み込みが完了した事を示している.
どうやらXMLの読み込みが完了する前に次のループに入り,XMLobj.readyState == 4にはならないらしい.
結局行き着いた解決法
func : function(counter) { var url = ""; XMLobj = new XMLHttpRequest(); url = "http://hogehoge" + String(counter); XMLobj.open("GET", url); XMLobj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); XMLobj.onreadystatechange = function() { if(XMLobj.readyState == 4 && XMLobj.status == 200){ Application.console.log(XMLobj.responseText); if (counter < 2) { this.func(counter + 1); } } }; }
関数をつくり,そこに引数を渡す.
そしてwhile文ではなく再起処理を行う.
もしかしたらもっといい方法もあるのかも.
追記.
処理が終了した時に設定するイベントハンドラで
onCompleteっていうモノがあるらしい.
今度こいつを試してみよう.