2012-04-29 9 views
0

このコードは正常ですが、連続ループではなく5回反復した後にユーザーが非アクティブ(マウス移動なし)であれば、ポーリングとclearIntervalを停止したいと思います。clearIntervalがjavascriptで呼び出された後、どのようにsetIntervalを再開できますか?

var i, active = new Date, iter = 1; 

$(window).on('mousemove', function(e){ 
active = new Date;   
}); 

i = setInterval(function(){ 
    if(new Date().getTime() - active.getTime() < 1000){ 
    console.log("sending active event to server....."); 
      iter = 1; 
    else{ 
     iter++; 
     if(iter >= 5){ 
      clearInterval(i); 
     } 
    }   
}, 2000); 

ここでは、この例では2秒ごとにチェックしています。私は、アクティブな日付を5回、5回連続して期限切れにした場合、clearInterval(i)を呼び出します。mousemoveコールバック内の何かが、現在実行中でない場合にのみ、setIntervalを再初期化する必要があります。どうすればこれを達成できますか?ヒントやサンプルをありがとう。私は可能な限り無名関数を使い続けたいと思います。

答えて

1

洗面所独立

function intFunc(){ 
    if(new Date().getTime() - active.getTime() < 1000){ 
    console.log("sending active event to server....."); 
      iter = 1; 
    else{ 
     iter++; 
     if(iter >= 5){ 
      clearInterval(i); 
     } 
    }   
}; 

今インターバル機能、必要な二つの場所にそれらを呼び出す

var i; 
$(window).on('mousemove', function(e){ 
    active = new Date;   
    i = setInterval(intFunc, 2000); 

}); 
i = setInterval(intFunc, 2000); 
0

つの簡単な方法だけでてclearIntervalコールを削除し、代わりにのみサーバーをポーリングすることですiter < 5

しかし、それは何もしていないときにハンドラがまだ呼び出されているので、あなたのラップトップ/携帯電話を省電力モードにしたいときには悪いです。だから、基本的にはあなたが持っていることですが、clearIntervalを呼び出した後、ポーリングを再開する1回限りのmousemoveハンドラを設定します。

私は(私はあなたがY-コンビネータなどに入るためにしたくない前提だ)関数を命名することなく、それを行うための方法を見ていないんだけど、あなたはその名前–などを非表示にすることができます–外界から無関係の機能を使用して、すべてのものをカバーします:

(function() { 
    var i, active = new Date, iter = 1; 

    $(window).on('mousemove', function(e) { 
     active = new Date; 
    }); 

    function startPolling() { 
     i = setInterval(function() { 
      if (new Date().getTime() - active.getTime() < 1000) { 
       console.log("sending active event to server....."); 
       iter = 1; 
      } 
      else{ 
       iter++; 
       if (iter >= 5) { 
        clearInterval(i); 
        $(window).one('mousemove', function() { 
         startPolling(); 
        }); 
       } 
      } 
     }, 2000); 
    } 

    startPolling(); 
})(); 
関連する問題