Elm-subscriptions
エルム-サブスクリプション
前の章で、ビューがコマンドを使用して他のコンポーネントと対話することについて説明しました。 同様に、コンポーネント(E.g. WebSocket)は、サブスクリプションを使用してビューと通信できます。 サブスクリプションは、Elmアプリケーションがキーボードイベント、タイマーイベント、WebSocketイベントなどの外部入力を受信できる方法です。
次の図は、Elmアプリケーションでのサブスクリプションの役割を説明しています。 ユーザーは、メッセージを介してElmアプリケーションと対話します。 指定されたアプリケーションはWebSocketを使用し、2つの操作モードがあります-
- コマンドを使用してクライアント側のデータをソケットサーバーに送信する
- サブスクリプション経由でソケットサーバーからいつでもデータを受信する
構文
サブスクリプションを定義するための構文は以下のとおりです-
図
簡単な例を使用してサブスクリプションを理解しましょう。
以下の例では、アプリケーションはサーバーにメッセージを送信します。 サーバーはエコーサーバーで、同じメッセージでクライアントに応答します。 すべての受信メッセージは、後でリストに表示されます。 WebSocket(wssプロトコル)を使用して、サーバーからのメッセージを継続的にリッスンできるようにします。 WebSocketはコマンドを使用してサーバーにユーザー入力を送信し、サブスクリプションを使用してサーバーからメッセージを受信します。
アプリケーションのさまざまなコンポーネントを以下に示します-
エコーサーバー
エコーサーバーには、wssプロトコルを使用してアクセスできます。 エコーサーバーは、ユーザー入力をアプリケーションに送り返します。 エコーサーバーを定義するためのコードは次のとおりです-
モデル
モデルは、ユーザー入力と、ソケットサーバーからの着信メッセージのリストを表します。 モデルを定義するためのコードは以下のとおりです-
メッセージ
メッセージタイプには、ユーザーからテキスト入力を取得するための入力が含まれます。 ユーザーがボタンをクリックしてWebSocketサーバーにメッセージを送信すると、送信メッセージが生成されます。 NewMessageは、エコーサーバーからメッセージが到着したときに使用されます。
View
アプリケーションのビューには、ユーザー入力をサーバーに送信するためのテキストボックスと送信ボタンが含まれています。 サーバーからの応答は、_div_タグを使用してビューに表示されます。
更新
更新機能は、メッセージとモデルコンポーネントを受け取ります。 メッセージタイプに基づいてモデルを更新します。
Sr. No. | Method | Signature | Description |
---|---|---|---|
1 | WebSocket.listen | listen : String → (String → msg) → Sub msg | Subscribes to any incoming messages on a websocket. |
2 | WebSocket.send | send : String → String → Cmd msg | Sends a wss request to a server address. It is important that you are also subscribed to this address with listen. If you are not, the web socket will be created to send one message and then closed. |
購読
サブスクリプション関数は、モデルオブジェクトを受け取ります。 WebSocketサーバーからメッセージを受信するには、_WebSocket.listen_を呼び出して、メッセージを_NewMessage_として渡します。 サーバーから新しいメッセージが届くと、updateメソッドが呼び出されます。
main
主な機能は、次に示すようにelmアプリケーションへのエントリポイントです。
すべてを一緒に入れて
- ステップ1 *-ディレクトリSubscriptionAppを作成し、ファイルSubscriptionDemo.elmを追加します。
- ステップ2 *-次の内容をSubscriptionDemo.elmファイルに追加します-
- ステップ3 *-elmパッケージマネージャーを使用してwebsocketsパッケージをインストールします。
- ステップ4 *-以下に示すように、indexlファイルをビルドして生成します。
- ステップ5 *-実行すると、次の出力が生成されます-