Comment garder une trace d'un processus par la fenêtre du navigateur et accéder à chaque événement dans l'azote?

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

  •  22-09-2019
  •  | 
  •  

Question

Dans l'azote, le framework web Erlang, j'ai le problème suivant. J'ai un processus qui prend soin d'envoyer et recevoir des messages à un autre processus qui agit comme une plaque tournante. Ce processus agit comme le processus comète pour recevoir les messages et mettre à jour la page.

Le problème est que lorsque le processus utilisateur un bouton je reçois un appel à l'événement. Comment puis-je obtenir Ahold de cette DID à un événement.

le code qui initie la communication et met en place la pièce de réception ressemble à ceci, je dois d'abord un événement qui démarre le processus client en appelant wf: comète:

event(start_chat) -> 
  Client = wf:comet(fun() -> chat_client() end);

Le code pour le processus client est le suivant, qui obtient et rejoint une chambre au début, puis entre dans une boucle envoyer et recevoir des messages à / de la pièce:

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).

Maintenant, voici le problème. J'ai un autre événement, send_message:

event(send_message) ->
  Message = wf:q(message),
  ClientPid ! {send_message, Message}.

sauf que ClientPid est pas là défini, et je ne peux pas voir comment obtenir Ahold de celui-ci. Toutes les idées?

La menace liée à la liste de diffusion de l'azote: http: // groupes. google.com/group/nitrogenweb/browse_thread/thread/c6d9927467e2a51a

Était-ce utile?

La solution

L'azote fournit un stockage clé-valeur par instance de page appelée state. De la documentation :

Récupérer une valeur d'état de page stockée sous la clé spécifiée. Page d'Etat est différent de l'état de session dans cet État Page est à portée définie une série de demandes par un utilisateur à une page d'azote:

wf:state(Key) -> Value

Enregistrer une variable d'état de page pour l'utilisateur en cours. Page d'Etat est différent de l'état de session dans cet État Page est à portée définie une série de demandes par un utilisateur à une page d'azote:

wf:state(Key, Value) -> ok

Effacer l'état de la page d'un utilisateur:

wf:clear_state() -> ok

Autres conseils

Avoir une table de cartes qui ets id de session de client à PID. Ou si l'azote fournit une sorte de gestion de session, stocker les pid données de session.

Tout ce qui doit se rappeler a besoin d'un processus. Il semble que votre fournisseur de chambre n'est pas.

Salle: join (Chambre) doivent être la chambre: rejoindre (chambre, auto ()). La chambre a besoin de savoir ce que votre pid comète processus.

Pour envoyer un message à un client vous devez d'abord envoyer le message à la chambre, la salle sera alors envoyer un message à tous les clients dans la chambre. Mais pour cela de travailler. Chaque client se joindre à la nécessité chambre de soumettre la comète pid. La chambre a besoin de garder une liste de tous les pid est dans la salle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top