0
setTimeout(function() {
    console.log("1");
}
console.log("2");

基本的には「2」より先に「1」を出力したいもの。コールバック関数を現在の「呼び出し元」スレッドと同期するにはどうすればよいですか?

4

2 に答える 2

3

次のようなものを試してください:

setTimeout(function() {
    console.log("1");
    callback();
}
function callback(){
   console.log("2");
}
于 2012-05-21T17:15:09.733 に答える
3

JavaScript でスレッドを保持することはできません (alertconfirmビルトインをconsole.log("2")除く) console.log("1")

  1. タイムアウト関数に入れます:

    setTimeout(function() {
        console.log("1");
        console.log("2");
    }, delay);
    

    ...または、そのタイムアウト関数が呼び出す別の関数では、 の関数が既にあるため、別の関数がsetTimeout必要な理由は (コード構成を除いて) 不明です。

  2. setTimeoutより長い遅延で渡す別の関数に入れます。

    setTimeout(function() {
        console.log("1");
    }, delay);
    setTimeout(function() {
        console.log("2");
    }, longerDelay);
    

    longerDelay...実際にはそれよりも十分に長いのでdelay、スケジューリングに関して少し混乱しないように注意してください。

上で「スレッド」と言ったことに注意してください。特定の構文を持つWeb ワーカーを使用していない限り、ブラウザー上の JavaScript はシングルスレッドです。2 つの JavaScript 関数を同時に実行することはできません。エッジ ケースのブラウザー バグalertや ajax 補完などは別として (少なくとも一部のバージョンの Firefox では、関数が待機している間に ajax 補完コールバックを実行しますalert。奇妙ですが真実であり、信頼できるものは何もありません。クロスブラウザまたはクロスバージョンでさえ)、別の JavaScript 関数が実行されている間、そのトラックで 1 つの JavaScript 関数を一時停止することはできません。

于 2012-05-21T17:15:20.730 に答える