Doge log

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

遅延関数 その2

基本的に

  • add
  • remove

  • set
  • get

など対にするのがよろしいらしい。
なので元の関数も返せるようにしてみよう。

サンプル

<!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){
      var o = x.apply(exec, args);
      clearTimeout(timeout);
      return o;
    }
  }
  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);
  }
  
  func.origin = function(){
    return x;
  }
  
  return func;
}

function test(text1, text2){
  alert(text1);
  alert(text2);
}

var def = test.deferred(3000);
</script>

</head>
<body>
<input type="button" value="ORIGINAL" onclick="def.origin()('hoge1', 'hoge2');">
<input type="button" value="DEFERRED" onclick="def('hoge1', 'hoge2');">
<input type="button" value="CANCEL" onclick="def.cancel(true);">
<input type="button" value="CANCEL_RESET" onclick="def.cancel(false);">
</body>
</html>

基本概念は変えず。
origin弁当を返せるようにしておいてみた。
まーあんまし変わらんね。
あとclearTimeoutが怪しいので呼ばれるようにしてみた。
うくく。