連続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っていうモノがあるらしい.
今度こいつを試してみよう.