1

いくつかの処理を実行してから、100ミリ秒のsetTimeoutで自分自身を呼び出す再帰ポーリング関数があります。ただし、再帰ポーリング関数の実行中に長時間何かを実行する別の同期関数を呼び出すと、100msのsetTimeoutで呼び出された関数がキューに入れられると想定しますが、その長い関数が指定された量内に返されない場合時間の経過とともに、ブラウザはキューに入れられた関数を単に破棄しますか?この他の長時間実行関数が呼び出された後、再帰ポーリング関数の実行が停止したように見えるので、これを求めています。またconsole.log、再帰関数がsetTimeoutに到達して呼び出すことを確認しましたが、長い同期関数が呼び出された後、setTimeoutに渡された関数が呼び出されることはありません。これはすべてChrome23とFirefox15にあります。

4

2 に答える 2

0

setTimeout(100, funct) は、100 ミリ秒後に関数が実行されることを保証しません。

100 ミリ秒後にブラウザが何か他のことを行っているか、ハングしている場合は、戻ってきて実行するまで待機します。

ここ

function pausecomp(millis)
 {
  var date = new Date();
  var curDate = null;
  do { curDate = new Date(); }
  while(curDate-date < millis);
 }

var time = new Date();

setTimeout(function(){
    var lapse=new Date() -time;
    alert(lapse; 
},100);

pausecomp(300);

たとえば、100 ミリ秒の setTimeout が実行されている間に 300 ミリ秒のプログラム ループ。(http://jsfiddle.net/xX2b4/)

実行すると、300 ミリ秒のシステムがループでハングしたため、出力は 300+ の値になります。

于 2012-11-16T21:28:33.997 に答える
0

setTimeout関数を「自動的に」キャンセルすることはできません。ブラウザーがイベント ループに戻ることを許可している限り、それらの関数は呼び出されます。

自動的にキャンセルするタイマー機能が必要な場合は、比較的簡単に実現できます

window.setTimeoutMaybe = function(f, t0, t1) {
    t1 = t1 || (t0 * 10);
    var then = new Date();
    return window.setTimeout(function() {
        var now = new Date();
        if (now - then < t1) {
            f();
        } 
    }, t0);
};

つまりf、 time 後に呼び出しますt0が、時間が経過していない場合のみですt1

于 2012-11-16T21:48:06.753 に答える