2

Erlang Web フレームワークである Nitrogen には、次の問題があります。ハブとして機能する別のプロセスへのメッセージの送受信を処理するプロセスがあります。このプロセスはコメット プロセスとして機能し、メッセージを受信して​​ページを更新します。

問題は、ユーザーがボタンを処理すると、イベントが呼び出されることです。イベントでその Pid を入手するにはどうすればよいですか。

通信を開始して受信側をセットアップするコードは次のようになります。最初に、wf:comet を呼び出してクライアント プロセスを開始するイベントがあります。

event(start_chat) -> 
  Client = wf:comet(fun() -> chat_client() end);

クライアント プロセスのコードは次のとおりです。これは、最初にルームを取得して参加し、その後、ルームとの間でメッセージを送受信するループに入ります。

chat_client() -> 
  Room = room_provider:get_room(), 
  room:join(Room), 
  chat_client(Room).

chat_client(Room) -> 
  receive
    {send_message, Message} ->
      room:send_message(Room, Message);
    {message, From, Message} -> 
      wf:insert_bottom(messages, [#p{}, #span { text=Message }]), 
      wf:comet_flush()
  end, 
  chat_client(Room).

さて、ここで問題です。send_message という別のイベントがあります。

event(send_message) ->
  Message = wf:q(message),
  ClientPid ! {send_message, Message}.

ClientPid がそこで定義されていないことを除いて、それを取得する方法がわかりません。何か案は?

Nitrogen メーリング リストの関連する脅威: http://groups.google.com/group/nitrogenweb/browse_thread/thread/c6d9927467e2a51a

4

3 に答える 3

2

Nitrogen は、 と呼ばれるページ インスタンスごとのキー値ストレージを提供しますstateドキュメントから:

指定されたキーの下に格納されているページ状態値を取得します。ページ状態は、1 人のユーザーから 1 つの Nitrogen ページへの一連の要求に範囲が限定されるという点で、セッション状態とは異なります。

wf:state(Key) -> Value

現在のユーザーのページ状態変数を保存します。ページ状態は、1 人のユーザーから 1 つの Nitrogen ページへの一連の要求に範囲が限定されるという点で、セッション状態とは異なります。

wf:state(Key, Value) -> ok

ユーザーのページの状態をクリアします。

wf:clear_state() -> ok
于 2010-01-04T18:25:35.520 に答える
0

覚える必要のあるすべてのことには、プロセスが必要です。あなたのルームプロバイダーはそうではないようです。

room:join(Room) は room:join(Room,self()) である必要があります。ルームは、comet-process pid が何であるかを知る必要があります。

クライアントにメッセージを送信するには、最初にメッセージをルームに送信します。次に、ルームがルーム内のすべてのクライアントにメッセージを送信します。しかし、それが機能するために。ルームに参加するすべてのクライアントは、comet-pid を送信する必要があります。ルームは、ルーム内のすべての pid のリストを保持する必要があります。

于 2010-01-04T07:24:44.717 に答える
0

セッション ID をクライアント PID にマップする ets テーブルを用意します。または、窒素が何らかの種類のセッション管理を提供する場合は、Pid をセッション データとして保存します。

于 2010-01-03T15:46:52.757 に答える