javascriptのsetTimeoutを使用して、

処理を繰り返しているのですが
ネットワークエラーなどが発生したら
clearTimeoutするみたいな事は
出来るのでしょうか?

ネットワークエラーというのは
setTimeoutで5秒ごとに繰り返していて
ネットワークケーブルを抜いた時に
レスポンスがない場合に
clearTimeoutを実行したいです。

回答の条件
  • 1人5回まで
  • 登録:2007/05/28 11:04:00
  • 終了:2007/05/28 16:29:35

回答(1件)

id:susie-t No.1

susie-t回答回数99ベストアンサー獲得回数182007/05/28 13:44:47

ポイント60pt

この場合、Ajaxでサーバのデータを取得を試み、失敗した場合は通信エラーとして処理するのがいいと思います。

<html>
<head>
<script>
<!--
function getTransport(){
  try{return new XMLHttpRequest();}catch(e){
  try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(e){
  try{return new ActiveXObject('Microsoft.XMLHTTP');}catch(e){
  }}}
  return false;
}
function check(){
  var transport = getTransport(); 
  if(!transport) return;
  transport.open('POST', 'test.txt', false);
  transport.send('');                     
  if(!transport.status
  || transport.status >= 200 &amp;&amp; transport.status < 300){
    return true;
  }else{
    return false;
  }
}
function test(){
  var elem = document.getElementById("test");
  if(!check()){
    elem.innerHTML = new Date() + ":通信エラー発生";
  }else{
    elem.innerHTML = new Date() + ":通信中・・・";
    setTimeout(test, 5000);
  }
}
//-->
</script>
</head>
<body onload="test();">
<div id="test"></div>
</body>
</html>

サーバ側のデータ(test.txt)は適当に用意してください。

check関数は通信成功時にtrue、失敗時にfalseを返却します。成功時のみsetTimeoutを使用することで、通信失敗時に処理を止めます。

注意として、ここでは同期通信を採用しているので、通信中は処理が停止するという点があります。

参考になれば幸いです。

id:hopefully

わかりました。

ありがとうございます。

2007/05/28 16:29:15
  • id:susie-t
    すみません、上記例でエラーが発生する件ですが、transport.send('');をtry catchによりくくり、エラーを補足してreturn falseすることで解消します。
    ただ、Operaで正常に動作しませんでした。非同期でも試してみましたが、こちらはIE以外で正常に動作しませんでした。
    仕様を満たせないまま終了していただいて申し訳ないです。
  • id:hopefully
    transport.send('');をtry catchするにはどう書けばいいのでしょうか?
  • id:susie-t
    ---------------------------
    try{
    transport.send('');
    }catch(e){
    return false;
    }
    ---------------------------
    としてください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません