18

トリガー機能は同期しているように見えます。つまり、バインドされたすべての関数が順番に同期して実行されているように見えます(呼び出された関数は非同期で何かを実行する場合がありますが、それは問題ではありません)。

これは、カスタムイベントと非カスタム(クリック、ホバーなど)イベントに当てはまりますか?Javascriptのシングルスレッド保証が当てはまらないイベントはありますか?

trueの場合、バインドされた各関数にタイムアウトを挿入せずに非同期で実行するように動作を変更できますか?

これが質問を示すサンプルです:

var ele = $('#blah');
// Example of the bound function doing something synchronously
ele.bind('customEvent.sync', function() {
    // Do something synchronously
    window.foo = 'foo';
});

// Example of the bound function doing something asynchronously
ele.bind('customEvent.async', function() {
    window.setTimeout(function() {
        // Do something asynchronously
        window.bar = 'bar';
    }, 0);
});

// Trigger both events
ele.trigger('customEvent');

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted
alert(window.foo + ':' + window.bar);

更新 参照:JavaScriptはシングルスレッドであることが保証されていますか? Javascriptはシングルスレッドであるため、カスタムイベントは同期することが保証されています。一部の組み込みイベントタイプは、ブラウザの不整合が原因で同期されない場合があります。

4

1 に答える 1

18

私自身が上で提供したコメントの軽く修正されたアンソロジー-ビートルート-ビートルート:

  • イベントには期間がありません。ハンドラーがアタッチされている場合、スレッドが開始されます。したがって、イベント自体は、同期でも非同期でもありません。イベントが刺激するスレッドは常に同期しますが、1つ以上の非同期プロセスを開始する場合があります。

  • の呼び出し.trigger()は、トリガーされたイベントハンドラーで開始される可能性のある非同期プロセスに関係なく、常に同期です。トリガーされたハンドラーが戻ると、実行は.trigger(...)に続くステートメントに戻ります。つまり、.trigger()は栄光の関数呼び出しです。

  • javascriptでは、タイムアウト期間が0の場合でも、setTimeout()で配置されたものが開始する前に、現在のスレッドが完了するまで実行されることが絶対に保証されます。ajaxと同じです。たとえば、呼び出すスレッドは、$.ajax(...)前に完了するまで実行されることが保証されます。サーバーがすぐに応答する場合でも、成功/エラー/完了ハンドラーのいずれかが開始されます。

  • シングルスレッド性は、ECMA-262(javascript)に固有のものです。いつでも、最大1つのスレッドを実行できます。

追加ポイント:

javascriptはシングルスレッドであることが保証されていますか誤った前提に基づいています。javascriptがシングルスレッドではないという証拠は提供されていません。@KrisGiesingによるコメントは、誤解を暴きます。

于 2012-12-24T06:26:12.440 に答える