Comment garder une trace d'un processus par la fenêtre du navigateur et accéder à chaque événement dans l'azote?
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
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.