2012-04-21 15 views
8

私はthisを参照しています。すべてがまだ明確ではありません。Javascript setTimeoutは他のスクリプトの実行を停止しますか

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

私の質問:

  • 私は他のスクリプト機能も停止し、私の機能のロードが終了するのを待ちますsetTimeout()を使用していますか?この場合であるかもしれない何

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

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

これでも時間間隔を増加させた後、私はnull値を返します。 fillTree()は実行を一時停止しますか?

+0

いいえ、 'setTimeout'は他のコードの実行を一時停止しません。 'fillTree()'の完了時に 'checkSelectedBoxes()'を呼び出そうとしているのであれば、それをコールバックパラメータとして渡すのはなぜですか、単に 'fillTree()'の最後に渡すのですか? –

+0

@RoryMcCrossan @RoryMcCrossanありがとうございました。あなたの答えは最良の解決策だと思われますが、そのCMSは私が使用しています。ツリーは他の多くの関数で使用されているので、干渉しないように他のjsファイルに設定されています。同じ –

答えて

9

いいえ、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 
}) 
+0

ありがとうございます。それはすべてをクリアしました。私は8分で受け入れます:P。また、質問doesntの状態がそうですが、あなたは私のアプローチでなければならないものにそのようなケースをアドバイスできますか? –

+0

fillTreeは何をしますか?それはAjaxコールですか? DOMウォーキング?何がそんなに長くかかりますか? – Joseph

+3

"そのタスクを実行行に挿入する"は完全に正確ではありません。ユーザーコードを中断せず、同時に実行することもありません。 JSユーザコードが実行されておらず、タイムアウトに達したときにのみ実行されます。 – Lucero

1

そのCMSは、私が使用していますし、木はJSいくつかの他のファイルに設定されている、私はそれが他の多くの機能を使用し、ケースは

常に同じではないかもしれないように干渉しませんよ

fillTree()関数を変更できない場合は、それをあなた自身の関数にラップし、その関数にコールバック関数を適用することができます。このお試しください:

function doStuff(callback) { 
    fillTree(); 

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

doStuff(checkSelectedBoxes); 
+0

あなたの答えは私の機能に役立ちましたが、私の質問に対する答えは@josephによって与えられました。ありがとう! –

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" />

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が知っているどのように本当に興味があります。一定期間スリープするスレッドを生成しますか?もしそうであれば、スリープするスレッドの数に制限がありますか、スリープしているスレッドが必要になるまで「保存」されていますか?非常に混乱します。

私は、ちょうど第二にはusleep。 はusleepと睡眠は、効率的な待機状態 に現在のスレッドを入れて、それが正確に1秒である必要はありません場合は、」

とは何かを持っていると思いますあなたがリクエストした時間以上であれば、 は再びスケジュールされることができます。

正確な時刻に近づけない場合は、 clock()をチェックする必要はありません。

からpthread sleep function, cpu consumption

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

関連する問題