13

私はこれを参照しています。すべてがまだ明確ではありません。

  • fillTree()ツリーを更新するJS関数があります。チェックボックスがあります。
  • 選択したチェックボックスをチェックするためにcheckSelectedBoxes()実行される別の関数があります。window.onload
  • 現在、他の多くの機能が接続されています。

私の質問:

  • 使用している場合setTimeout()、他のスクリプト関数も停止し、関数の読み込みが完了するのを待ちますか?

これはどうなるでしょうか。

function fillTree(){...}
function checkSelectedBoxes(){...}

fillTree(); // This take time to get data. onLoad() doesnt work.
setTimeout(function(){ checkSelectedBoxes()  },5000);

これにより、時間間隔を増やした後でもnull値が返されます。fillTree()実行を一時停止しますか?

4

4 に答える 4

15

いいえ、setTimeoutあなたを待っていません(したがって、JSには一時停止機能がありません)。setTimeout後でそのタスクを取っておき、次の行を実行できるようにします。そのタイムアウトに達すると、そのタスクが実行行に挿入されます。また、他のコードが実行されていない場合は、示された機能を実行します。

あなたがしたいことはあなたにコールバックを与え、fillTree()それが終わったら実行することです。

function fillTree(callback){

    //do something very long

    callback(); //execute passed function when it's done
}

fillTree(function(){
    checkSelectedBoxes(); //executes only when fillTree finishes
})
于 2012-04-21T10:13:33.930 に答える
2

私が使用しているCMSであり、ツリーは他の多くの関数で使用されており、ケースが常に同じであるとは限らないため、干渉しない他のjsファイルに設定されています。

fillTree()関数を変更できない場合は、関数を独自の関数でラップして、それにコールバック関数を適用できます。これを試して:

function doStuff(callback) {
    fillTree();

    // Call the callback parameter (checkSelectedBoxes() in this case)
    // when fillTree() has completed
    callback();
}

doStuff(checkSelectedBoxes);
于 2012-04-21T10:18:00.393 に答える
0

関数は実行を待機せず、setTimeout次のスニペットで明確に確認できます。waitTimesランダムな時間の配列が与えられた場合、Array.map関数が最初にすべてのtime[index]=waitTimes[index]値を出力し、次にミリ秒の直後にが起動されたwait[index]=waitTimes[index]ときにどのように出力されるかを確認できます。setTimeoutwaitTimes[index]

var console = {
  log: function(s) {
    document.getElementById("console").innerHTML += s + "<br/>"
  }
}
var roundDecimals = function(num, pos) {
  pos = pos || 4;
  return (Math.round(num * Math.pow(10, pos)) / Math.pow(10, pos));
}
var arrayRangeMap = function(a, block) {
  c = [];
  while (a--) c[a] = block();
  return c
};
var getRandomArbitrary = function(min, max) {
    return (Math.random() * (max - min) + min);
  }
  // random 10 wait times, 3 decimal positions
var waitTimes = arrayRangeMap(10, function() {
  return roundDecimals(getRandomArbitrary(0.250, 0.5, 3) * 1000, 2);
});

waitTimes.map(function(item, index) {
  setTimeout(function() {
    console.log("wait[" + index + "]=" + item);
  }, item);
  console.log("time[" + index + "]=" + item);
});
<div id="console" />

于 2016-04-17T22:36:50.360 に答える
0

私はちょうど興味があるかもしれないテストをしました:

<!DOCTYPE html>
<html>
  <head>
    <script>

/* test: if returns in around 1000ms, must interrupt, otherwise it is indeed
   not going to let timeout work until work is done. */    
window.onload = function() {
    var before = performance.now();
    setTimeout(function() {
        alert('completed in ~' + (performance.now() - before) + ' nanoseconds.');
    }, 1000);

    /* count to 2^31 - 1... takes 8 seconds on my computer */
    for (var i = 0; i < 0xffffffff; ++i) {
        /* me busy, leave me alone */ 
    }
};      
    </script>
  </head>
  <body>
  </body>
</html>

私は今、JavaScriptが特定の時間が経過したことをどのように知るのか本当に興味があります。一定期間スリープするスレッドを生成しますか?もしそうなら、スリープするスレッドの数に制限がありますか、それともスリープしているスレッドは必要になるまで「保存」されますか?多くの混乱。

私はそれが関係があると思います

「正確に1秒である必要がない場合は、1秒だけusleepします。usleepとsleepは、現在のスレッドを、少なくとも要求した時間の効率的な待機状態にします(その後、再度スケジュールできるようになります)。 )。

正確な時刻に近づこうとしないのであれば、clock()をチェックする必要はありません。」

--pthreadスリープ関数、CPU消費

それで、オペレーティングシステムがあなたのためにスケジューリングを行うと思います、その時点でそれはエンジンを中断し、エンジンは世界を止め、タイムアウト機能をキューの一番上に置いてできるだけ早く実行されますか?

于 2016-08-15T05:05:47.910 に答える