電子書籍の厳選無料作品が豊富!

連続して非同期の通信を行う方法が分からず困っています。

下のようなコードを書きました。
クライアントからサーバにある「hoge1.txt」をGETするというものです。
その処理を行う関数(httpXMLRequest)を一つだけ呼び出すとうまくいきます。しかし二つ目に読み込んだ処理が実行されません。
同時に、というのは無理なのでしょうか。。

--------
            ・
            ・
            ・
httpXmlRequest('hoge1.txt','GET','',dspXMLElement,httpError)
//httpXmlRequest('hoge2.txt','GET','',dspXMLElement,httpError)
}

function httpXmlRequest \ (target_url,method,data,success_func,error_func){
httpObj=new XMLHttpRequest()
timerId=setInterval('timeoutCheck()',1000)
httpObj.open(method,target_url,true)
httpObj.onreadystatechange=function(){
if(httpObj.readyState==4){
clearInterval(timerId)
if(httpObj.status==200){
success_func(httpObj.responseXML)
httpObj.abort()
}
else{
erro_func(httpObj.status+':'+httpObj.statusText)
return false
}
}
}

httpObj.send(data)
}


以上、よろしくおねがいします。

A 回答 (1件)

同時に、の意味がよくわかりませんが、


open、sendした後、サーバーからの応答を受信、接続を終了する前に、別のデータを送受信したいのであれば、
XMLHttpRequestオブジェクトを2つ以上作成し、それぞれ個別にopenしなければなりませんが、
接続を終了したあとでもう一度openするのであれば、1つのオブジェクトを使い回し出来ます。

受信するファイル名が.txtで、statusのチェックが200またはelseしかありませんが、
304(更新されていない)が返っているのではないでしょうか。

var d=new Date();
uri+='?'+d.getTime();
httpObj.open('GET', uri);
URIの後ろに日付などを入れて、常に最新のデータを受信するようにしたり、
Last-Modified-Ifヘッダを追加したり、

if(httpObj.status==200 || httpObj.status==304){
として、更新されていない場合でも受信完了として処理するか、
どちらかしておかないと行けないと思います。

頻繁に更新されるファイルでないのなら、304の処理を追加する方がいいと思います。
    • good
    • 0
この回答へのお礼

やりたかったことは、お察ししてくださいましたように
>open、sendした後、サーバーからの応答を受信、接続を終了する前に、別のデータを送受信
になります。
XMLHttpRequestオブジェクトを2つ以上作成すればよいですね。。気がつきませんでした。。。

その他にも304の処理の説明など参考になりました。

ご丁寧な対応感謝しております。ありがとうございました。

お礼日時:2006/12/30 11:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!