Как отслеживать процесс в каждом окне браузера и получать к нему доступ при каждом событии в Nitrogen?
Вопрос
В Nitrogen, веб-фреймворке Erlang, у меня возникла следующая проблема.У меня есть процесс, который отвечает за отправку и получение сообщений другому процессу, который действует как концентратор.Этот процесс действует как процесс кометы для получения сообщений и обновления страницы.
Проблема в том, что когда пользователь обрабатывает кнопку, я получаю вызов event.Как мне получить этот 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
Решение
Nitrogen предоставляет хранилище значений ключа для каждого экземпляра страницы, называемое state
.Из документация:
Получить значение состояния страницы, хранящееся под указанным ключом.Состояние страницы отличается от состояния сеанса тем, что состояние страницы ограничено серией запросов одного пользователя к одной странице Nitrogen:
wf:state(Key) -> Value
Сохраните переменную состояния страницы для текущего пользователя.Состояние страницы отличается от состояния сеанса тем, что состояние страницы ограничено серией запросов одного пользователя к одной странице Nitrogen:
wf:state(Key, Value) -> ok
Очистите состояние страницы пользователя:
wf:clear_state() -> ok
Другие советы
Создайте таблицу ets, которая сопоставляет идентификаторы сеанса с идентификаторами клиентов Pid.Или, если азот обеспечивает какое-либо управление сеансом, сохраните Pid как данные сеанса.
Любая вещь, которую необходимо запомнить, требует процесса.Похоже, что ваш провайдер номеров этого не делает.
room:join(Room) должно быть room:join(Room,self()).Комната должна знать, какой у вас pid кометного процесса.
Чтобы отправить сообщение клиенту, вы сначала отправляете сообщение в комнату, затем комната отправит сообщение всем клиентам в комнате.Но чтобы это работало.Каждый клиент, присоединяющийся к комнате, должен отправить Comet-Pid.В комнате должен храниться список всех PID в комнате.