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. 从文档中:

检索存储在指定键下的页面状态值。Page State 与 Session State 的不同之处在于,Page State 的范围是一个用户对一个 Nitrogen 页面的一系列请求:

wf:state(Key) -> Value

存储当前用户的页面状态变量。Page State 与 Session State 的不同之处在于,Page State 的范围是一个用户对一个 Nitrogen 页面的一系列请求:

wf:state(Key, Value) -> ok

清除用户的页面状态:

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

有一个将会话 ID 映射到客户端 Pid 的 ets 表。或者,如果氮提供任何类型的会话管理,请将 Pid 存储为会话数据。

于 2010-01-03T15:46:52.757 回答
0

每一件需要记住的事情都需要一个过程。看起来你的房间供应商不是。

room:join(Room) 必须是 room:join(Room,self())。房间需要知道你的彗星进程 pid 是什么。

要向客户端发送消息,您首先将消息发送到房间,然后房间将向房间中的所有客户端发送消息。但要让它发挥作用。每个加入房间的客户都需要提交 comet-pid。房间需要保留房间中所有 pid 的列表。

于 2010-01-04T07:24:44.717 回答