非同期通信が絡んだ時のループ処理について質問があります。
今、指定のURL郡のHTMLデータを非同期で取得して、取得が終えたら、そのドキュメントを解析する処理を行なうプログラムをjavascriptで書いています。
この時、どうループ処理を行なうと良いのでしょうか?
通信を行なう部分だけを以下のようにループさせてしまうと、
非同期処理が終わる前に次のurlにアクセスしてしまうようで、
上手く行きません。
※以下はダメ。
for(var i = 0; i < urlList; i++){
xhr.open("GET", urlList)
xhr.send();
}
なので、以下のイベント発生を探知した時に発生するメソッド内で、
指定回数になるまで、xhr.openとsendを行なうのが良いのかなと思いました。
xhr.addEventListener("load", scrape);
function scrape(response){
parse(xhr.response);
//ここで、また、xhr.openとsendを実行。
指定の回数になったらストップするようにカウンタ変数を用意して、実行される度にインクリメントをしておく。
}
ただ、なんか美しさに欠ける気がしています。
この場合、再帰呼び出しとかって関係ありますか?あまり再帰呼び出しというのを普段使ったことが無いので使いどころもよくわからないのですが、こういう場合はどうやってループさせると良いのでしょうか?
アドバイスを頂けると嬉しいです!
■ ざっくりとしたサンプルコード
//解析対象のURL郡
var urlList = ["url1","url2","url3",];
var xhr = new XMLHttpRequest();
//読み込み完了したらパースする一連のイベント設定と処理
xhr.addEventListener("load", scrape);
function scrape(response){
parse(xhr.response);
}
function parse(){
//取得したHTMLドキュメントのパース処理をここに記述
}
//非同期通信
xhr.open("GET", urlList)
xhr.send();
みんなの回答 1 件
タイミング待ちは基本イベントとコールバックでいいんじゃない?
再起呼び出しは、関数Fに配列を渡して、要素を一つ一つ見て行って、値だったら処理へ、配列だったら関数Fに再度渡すって感じ。
関連するトピックス