如何跟踪每个浏览器窗口的进程并在氮气中的每个事件中访问它?

时间:2010-01-03 10:07:09

标签: erlang nitrogen

在Nano,Erlang web框架中,我有以下问题。我有一个流程负责向另一个充当集线器的进程发送和接收消息。此过程充当接收消息和更新页面的彗星过程。

问题是,当用户处理按钮时,我会收到对事件的调用。如何在活动中获得该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,我看不出如何得到它。有什么想法吗?

氮气邮件列表中的相关威胁:http://groups.google.com/group/nitrogenweb/browse_thread/thread/c6d9927467e2a51a

3 个答案:

答案 0 :(得分:2)

Nitrogen为每页实例提供一个名为state的键值存储。来自documentation

检索存储在指定键下的页面状态值。页面状态与会话状态的不同之处在于页面状态的范围由一个用户对一个氮页面的一系列请求:

wf:state(Key) -> Value

为当前用户存储页面状态变量。页面状态与会话状态的不同之处在于页面状态的范围由一个用户对一个氮页面的一系列请求:

wf:state(Key, Value) -> ok

清除用户的页面状态:

wf:clear_state() -> ok

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

房间:加入(房间)需要房间:加入(房间,自己())。房间需要知道你的彗星加工过程是什么。

要向客户发送消息,首先将消息发送到房间,房间将向房间中的所有客户发送消息。但为了那个工作。每个加入房间的客户都需要提交comet-pid。房间需要保留房间里所有pid的清单。

相关问题