setTimeoutについて

実は、余計なリクエストが飛ばないようにsetTimeoutが使えないか考えていた。

  1. keydownが発生するごとに、番号を振る。
  2. setTimeoutで呼び出す関数に、引数としてkeydownが発生した時の番号を渡す。
  3. 1秒後に引数の番号と、現在の番号を比較する。
  4. 同じだったら処理を行う。違ったら何もしない。


頑張ってお絵描きした。余計分かり辛い。
1回目のkeydownが発生する。
1回目のkeydownの1秒以内に2回目のkeydownが発生する。番号が変わる。
1回目のkeydownの1秒後に番号を比較すると番号が違うので何もしない。
2回目のkeydownの1秒以内に、3回目のkeydownが発生する。番号が変わる
2回目のkeydownの1秒後に番号を比較すると番号が違うので何もしない。
3回目のkeydownが1秒後に番号を比較すると番号が同じなので処理を行う。
これだ!と思ったが、うまく実装できなかったので諦めていた。
id:chris4403さんから教えてもらったclearTimeout( timer_id )はまさにこの処理だった。
車輪の再発明をするところだった。でも自分の発想力の正しさがわかって嬉しい!
ちなみにこれは、楽観的排他制御の考え方を応用できないかなぁと考えていて思いついた。


ちなみにこんなスクリプトを書いて、Firebugから実行して試していた。
これ自体は動くのだが、うまく組み込めなかった。

var checkNum = 0;

function a() {
  checkNum = checkNum + 1;
  var num = checkNum;
  setTimeout(
    function(num){
      if(num == checkNum){
        alert("合ってる " + num + " " + checkNum);
      }else{
        alert("違うよ  " + num + " " + checkNum);
      }
    }
    ,3000);
}

さらにその前はこんな感じでうまくいかなかった。

var checkNum = 0;

function a() {
  checkNum = checkNum + 1;
  var num = checkNum;
  setTimeout(b(num),3000);
}

function b(num) {
  if(num == checkNum){
    alert("同じだ!");
  }
}

なぜか3秒後ではなく、すぐにb(num)が実行されてしまう。おかしいおかしい。
id:chris4403さんのスクリプトと、先輩からの助言でsetTimeoutをsetTimeout("b(num)")としてみた。
これでうまくいくはず!と思いつつ、"b(num)"ってやったら引数渡せるのか?
実行してみるとやっぱりエラーだ・・・。当たり前な気がする。
setTimeoutに引数付きの関数を渡すにはどうすれば・・・。


もしかしてsetTimeout(function(){b(num)})か?

var checkNum = 0;

function a() {
  checkNum = checkNum + 1;
  var num = checkNum;
  setTimeout(function(){b(num)},3000);
}

function b(num) {
  if(num == checkNum){
    alert("同じだ!");
  }
}

おぉ、うまくいった。これが正しいのかよくわからないけど・・・。


プログラムはやっぱり書きながら覚えるものだ。
もう少し体系的に学ぶ必要があるな・・・。
でもこうやって頭を使って考えたことって、忘れにくいのでよしとしよう。
体で覚えるJavaScript