2010-01-03 30 views
2

在氮,Erlang web框架中,我有以下問題。我有一個過程,負責發送和接收消息到另一個充當集線器的進程。這個過程作爲彗星進程來接收消息並更新頁面。如何跟蹤每個瀏覽器窗口的進程並在每個氮氣事件中訪問它?

問題是,當用戶處理一個按鈕,我得到一個事件的調用。我如何在某個活動中獲得該Pid的扣留。

發起通信,並設置在接收部看起來像這樣,第一I具有通過調用WF啓動客戶端處理的事件的代碼:彗星:

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

回答

2

氮氣提供每個頁面實例的鍵值存儲,稱爲state。從documentation

檢索存儲在指定鍵下的頁面狀態值。頁面國家在該頁面國家從會話狀態不同的是由一個用戶範圍限定在一系列請求給一個氮頁:

wf:state(Key) -> Value 

商店爲當前用戶頁面狀態變量。頁面狀態從會話狀態不同之處在於頁面國家由一個用戶級範圍的一系列請求給一個氮頁:

wf:state(Key, Value) -> ok 

清除用戶的頁面狀態:

wf:clear_state() -> ok 
0

具有會話ID的映射到客戶pid的一個ETS表。或者如果氮氣提供任何類型的會話管理,則將Pid存儲爲會話數據。

+0

我理解它提供了一些會話管理,我還沒有使用它。但我需要根據每個窗口而不是每個瀏覽器來跟蹤它。同一個會話應該能夠跟蹤各種窗口中的各種客戶端連接。我雖然關於生成一個大的隨機數,並將它用作會話頂部的鍵,並將該鍵放在HTML中並對其進行跟蹤。不知道這是否是一個好的解決方案。 – Pablo 2010-01-03 20:49:10

+0

在這種情況下,我不能想到其他任何東西,只是按照您的建議生成唯一的鍵。但是,你不需要會話ID了;這些鍵應該是足夠的。 – Zed 2010-01-03 22:10:45

0

需要記住的每件事都需要一個過程。它看起來像你的房間提供者不是。

房間:加入(房間)需要房間:加入(房間,自我())。房間需要知道你的comet-process pid是什麼。

要向客戶發送消息,首先將消息發送到房間,然後房間會向房間中的所有客戶發送消息。但爲了工作。每個加入房間的客戶都需要提交彗星。房間需要保存房間裏所有pid的清單。

+0

房間實際上是一個過程。房間:加入(房間)確實gen_server:呼叫(房間,{加入,自我())。 – Pablo 2010-01-04 18:23:18

相關問題