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

当方、Javascriptで本格的なプログラムを組んだことが無いプログラマです。

書籍を参考にAJAXを使用したインターフェースを構築しているのですが、時折タイムアウトエラーが止まらず出続ける現象に遭遇して困っております。

原因・回避方法などがわかりましたらご教授ください。

httpRequestのアクセス部分のソースは以下のようになっています(見づらくてすみません)。

function httpPostRequest(target_url, post_data, funcitonReference) {
~~(XMLHttpRequestオブジェクト検証部分)~~
timerId = setInterval('timeoutCheck()', 1000);

httpObj.open("POST", target_url, true);
httpObj.onreadystatechange = function() {
if (httpObj.readyState == 4) {
clearInterval(timerId);
if (httpObj.status == 200) {
funcitonReference(httpObj.responseText);
} else {
alert(httpObj.status + ' : ' + httpObj.statusText);
funcitonReference(false);
}
}
}
httpObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
httpObj.send(post_data);
}

function httpObjGenerateFail() {
alert('This browser is outside the support.');
return false;
}

function timeoutCheck() {
timeout_sec --;
if(timeout_sec <= 0) {
clearInterval(timerId);
timeout_sec = 10;
httpObj.abort();
alert('Time out');
return false;
}
}

A 回答 (2件)

予想ですが、



timeoutCheck()
のイベント来る前に、
再度 httpPostRequest()が呼ばれた場合、

>> timerId = setInterval('timeoutCheck()', 1000);

で、新規で timerId 発版するので前回の timerId が解放されずに残ってしまったのかと、。

なので、解決策としては、
>> timerId = setInterval('timeoutCheck()', 1000);
する前に、timerIdが残ってないか判定して、残っていたら、

>> clearInterval(timerId);
する処理を追加すればいいかと思われます。

この回答への補足

回答ありがとうございます。
非同期であるがゆえに起こる問題ということですね。
参考にした書籍の著者はこの問題に気づいてないのですかね・・・。

ちなみに、timerIDの残っているかどうかの判定というのは
if(timerID)
で判断できるのでしょうか。
(すみません。月曜まで実行環境がないので・・・)

補足日時:2006/04/08 10:41
    • good
    • 0

>>if(timerID)


試して無いけど、
そのようにするなら、解放後にnull値入れないと無理。
    • good
    • 0
この回答へのお礼

助かりました。
ありがとうございます。
根本の原因はわかったので、後は研究してみます。

お礼日時:2006/04/09 01:45

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