すべての受信 Socketio イベントは、到着した順に処理を開始します。同期ハンドラー関数を持つものは、同じ順序で処理を完了することが保証されます。ただし、非同期ハンドラーを使用したイベントの場合は、任意の順序で処理を終了できるため、この限りではない可能性があります。この動作によりコードは高速化されますが、場合によっては、私たちが望むものではない可能性があります。
この短い投稿では、非同期タスクを含むイベントがサーバーに到着した順序で処理を開始および終了する方法を学びます。これを実現するために、シンプルなカスタム キュー システムを作成します。
飛び込みましょう
2 つのクライアントが Socketio サーバーに接続されている状況があると仮定します。最初にイベントを送信する人がデータベース テーブルに新しい行を作成し、2 番目にイベントを送信する人がその同じ行を更新するという動作が必要です。コードは次のようになります:
ここで、問題は、2 つのクライアントが同時に「SOME_EVENT」を発行すると、両方ともデータベースに新しい行を作成する可能性があるということですが、これは私たちが望んでいることではありません。
socketio にハンドラー関数の実行を許可する代わりに、ハンドラー関数をインターセプトして、いつ実行されるかを決定します。ハンドラーをインターセプトすると、それらを順番に実装する責任を負うキュー システムに送信します。
システムには、キューとイベント ループという 2 つの主要コンポーネントがあります。
コンピューター サイエンスにおいて、キューはデータを順番に保存および管理できるようにするデータ構造です。これを実現するために、この構造ではデータを一方の端 (末尾) で追加し、もう一方の端 (先頭) で終了することのみが許可されています。この特性は一般に FIFO (先入れ先出しを意味する) と呼ばれています。
キューは抽象データ型 (ADT) です。他の ADT と同様、JavaScript を含む多くのプログラミング言語にはデフォルトでは ADT がありません。この投稿では、JavaScript 配列の unshift メソッドと Pop メソッドを使用してキューをモデル化します。
大まかに言うと、イベント ループは一定の間隔で実行され、条件付きでタスクを実行する構造です。この例では setInterval を使用します。これはキューに保留中の関数が含まれているかどうかを常にチェックし、前の関数が完了した場合にのみ次の関数を呼び出します。
メッセージ キュー クラスは、関数を順番に受信して実行する準備ができました。
キュー システムを配置したら、それをコードで使用してみましょう:
JavaScript のバインド メソッドは、関数とそのパラメーターをオブジェクトにアタッチするために使用されますが、関数を呼び出すためではありません。私たちの場合、関数をオブジェクトにアタッチしていないため、最初の引数は null です。
作成したメッセージ キュー クラスは、非同期ハンドラーでイベントを順番に実行するのに役立ちます。より複雑なキュー システムが必要な場合は、BullMQ またはその他の堅牢なソリューションを調べてください。コーディングを楽しんでください!
以上がSocket.io イベントを順番に簡単に処理する方法: 短いガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。