6

websocket.onmessageサーバーが複数のメッセージを(次々に)送信でき、各メッセージがそのイベントをトリガーし、関数ブロックに数秒かかる可能性があるため(内部で多くのレンダリングが行われるため) 、のイベントハンドラーである関数があります)、最初の関数呼び出しがまだ実行されている間に、関数が再度呼び出される場合があります。場合によっては、この関数にクリティカルブロックが必要です。これにより、2番目の呼び出しは、最初の呼び出しが終了したときにのみクリティカルセクションを開始します。これは、JavaScriptでロックを実装するための「ベストプラクティス」と見なされますか?

4

3 に答える 3

4

js はシングルスレッドであるため、実際にはロックを行うことはできません。できますが、すべきではありません

1 つのアイデアは、ステータス変数を保持することです。

関数は onmessage ごとに呼び出されますが、変数が false に設定されている場合にのみ何かを行います。その場合は true に設定し、完了したら false に戻します。

var handler; //expose outside the closure
(function(){
    var busy = false;

    handler = function(){
        if( !busy ){
            busy = true;

            //do rendering stuff

            busy = false;
        }
    }
})();

明らかに、このアイデアを自分のニーズに合わせて調整してください。

于 2012-09-21T20:05:22.563 に答える
1

メッセージイベントのコールバックがあるため、jQuery Socket https://github.com/flowersinthesand/jquery-socketを使用できます。

message(data, [callback])

これは、最初のメッセージが完了した後に次のメッセージを取得できることを意味します。

例:

websocket.onmessage(data, function(){
  //get next message
});
于 2012-09-21T20:15:29.330 に答える
0

JS は、webworkers を使用する場合にのみマルチスレッド化されます。利用可能な同期がないため、ワーカー スレッドで Websocket が許可されているかどうかはわかりませんが、メイン スレッドからすべての Websocket をセットアップすると、すべてのイベントがメイン スレッドで順番に発生するため、自分でブロックまたは同期を実行する必要があります ( JS での同期に関するこのスレッドを参照してください)

于 2012-09-21T20:07:40.033 に答える