Как отслеживать процесс в каждом окне браузера и получать к нему доступ при каждом событии в Nitrogen?

StackOverflow https://stackoverflow.com/questions/1994490

  •  22-09-2019
  •  | 
  •  

Вопрос

В 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 в комнате.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top