2016-09-23 5 views
0

Ich möchte Chris McCord chat example ändern, um zusätzliche Funktionalität hinzuzufügen. Grundsätzlich möchte ich, dass der JavaScript-Client Zugriff auf eine Reihe von Komfortfunktionen wie getUsersInRoom(room_id), is_online(user_id) usw. hat, die JSON verwenden.Hinzufügen von benutzerdefinierten Funktionen zu Kanälen

Aber ich bin mir nicht sicher, wie das geht. Die docs auf Kanäle sagen, dass:

Jeder Kanal ein umsetzt oder mehr Klauseln jedem dieser vier Callback-Funktionen -/3 anschließen, beenden/2, handle_in/3 und handle_out/3.

Bedeutet das, dass dies die einzigen erlaubten Funktionen sind? Ich denke, was ich brauche, ist eine Socket-API, aber ich habe noch nie zuvor mit Sockets gearbeitet und werde einige Hilfe zu schätzen wissen. Außerdem scheint das Beispiel bei direkten Funktionsaufrufen mit Strings zu funktionieren, die als Argumente übergeben werden, aber ich brauche mein Chatsystem, um JSON zu verwenden. Ich bin mir überhaupt nicht sicher, wie ich das erreichen kann.

Antwort

0

Ihre Frage ist ein Zweiteiler, also gebe ich Ihnen eine zweiteilige Antwort. Außerdem ist deine Frage eher allgemein gehalten als spezifisch für Elixir oder Phoenix, also behalte ich die Antworten auch generell.

Auch scheint das Beispiel auf direkte Funktionsaufrufe mit Strings als Argumente übergeben, aber ich brauche mein Chat-System, um JSON zu verwenden. Ich bin mir überhaupt nicht sicher, wie ich das erreichen kann.

Es gibt keine JSON-Typen über die Leitung. Sie marshalen (stringifizieren) JSON in eine Zeichenkette, senden diese Zeichenkette und entpacken sie dann wieder in JSON auf der anderen Seite. Also, wenn Sie Ihre Nachrichten als JSON strukturieren wollen, das ist total cool, denken Sie daran, an jedem Empfangspunkt zu marshalen/unmarshalen.

(paraphrasiert) Komfortfunktionen

Der einfachste Weg, dies zu tun ist, indem diese Funktionen tatsächliche Nachrichtentypen zu machen, dann ist entweder handle_in oder handle_out Funktionen diese Art herausgreifen, sammeln und die Rück Daten. Angenommen, eine Nachricht lautet current_online_users, die eine Liste von Handles zurückgibt. Sie können diese Liste clientseitig filtern, um nach Anwesenheit zu suchen. Einige Websocket Implementierungen haben auch Presence Hooks, aber ich bin mit denen in Phoenix nicht vertraut.

Eine andere Möglichkeit, dies zu tun, ist, indem Sie Ihre JSON-Nachrichtenstruktur erstellen. Auf oberster Ebene können Sie die aktuelle Anzahl von Benutzern in einem Raum zurückgeben, die von Phoenix aus gesehen werden.

Hoffe, das hilft.

Verwandte Themen