-
ID:jbA5T2 さんの質問

非同期通信が絡んだ時のループ処理について質問があります。

今、指定の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 件

ID:aNNARO さんの回答

タイミング待ちは基本イベントとコールバックでいいんじゃない?

再起呼び出しは、関数Fに配列を渡して、要素を一つ一つ見て行って、値だったら処理へ、配列だったら関数Fに再度渡すって感じ。

ID:rR7Q9V

つまり、今とおなじで良いということでしょうか?

ID:5yhzCz

並列処理しちゃダメなの?

ID:jbA5T2

すいません。ちょっと並列処理がわからないです。

どういう感じで行なうのでしょうか?

ID:jbA5T2

並列処理をすれば、複数のURLに対するスクレイピングを並行して出来るということですか?

つまり、今は1つ1つURLに非同期でアクセスしてデータとって、ごにょごにょして完了したら、次のURLに同じ事をするってことをしてますが、それをする必要がなくなるということですか?

最終更新日:2014-09-03 (3,720 views)

関連するトピックス

ページ上部に戻る