Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

遅延関数 その1

ビールを飲みつつjavascriptとか書いてるんだけど手が動かないね。
とりあえず遅延系はあってもいいかなあと。
基本的にjavascriptはシングルスレッドなので待ちがどーのこーのってのはあんまりないんだけどね。
XXX処理が終わるまでに〜であればキャンセルみたいな使い方を想定してます。
コレ系は基本的にキャンセルは実装せねば役ただずかなと。

サンプル

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-31j">
<title>Deferred Sample</title>

<script type="text/javascript">
Function.prototype.Deferred = function(time){
  var x = this;
  var timeout;
  var args = [];
  
  var exec = function() {
    if(!exec.__cancel){
      return x.apply(exec, args);
    }
  }
  exec.__cancel = false;
  
  var func =  function(){
    for(var i = 0; i < arguments.length;i++){
      args.push(arguments[i]);
    }
    timeout = setTimeout(exec, time);
  }

  func.cancel = function(c){
    exec.__cancel = c;
    clearTimeout(timeout);
  }
  return func;
}

function test(text1, text2){
  alert(text1);
  alert(text2);
}
var def = test.Deferred(3000);
def('hoge1', 'hoge2');
</script>

</head>
<body>
<input type="button" value="CANCEL" onclick="def.cancel(true);">
</body>
</html>

アラートを出す関数を3秒後に実行します。
3秒までにボタンを押すとキャンセルします。
細かい所は酔ってるので勘弁してください。
clearしてるからフラグ判定いらないっちゃあいらんのだけど状態としてのキャンセルって持っててもいいのかな。
LDRでも遅延のテクが使われてるのであると何かにつけて便利になるはず!
(たとえばToolTipsやPopupの表示時間を調整とかね。一定時間表示後消すみたいな)
参考になった人はコメント下さい。
うくく。