on()-Funktion unter ws

  • on()-Funktion unter ws

    Hallöchen,

    unter socket-io konnte man bequem mit on() alles handhaben, leider ist es im ws-client nicht möglich da müsste man es selber schreiben.
    Allerdings finde ich JS immer noch sehr konfus und es würde mich freuen würde mir wer dabei helfen.

    Ich schätze mal es muss ne Art-prototype her, so das wenn eine on-Funktion kommt diese zum eventListener hinzugefügt wird...

    JavaScript-Quellcode

    1. socket.on('test', function(data){
    2. console.log('test empfangen mit:', data);
    3. });

    Serversetitig wäre wohl auch eine Anpassung nötig, es wäre schön wenn mann den Befehl 'test' getrennt von den zu übertragenden Daten unter event.data senden könnte (zb. event.cmd), andernfalls müsste man halt den Befehl dort mit integrieren und beim empfangen auseinander basteln.

    Aber mir fällt einfach nichts dazu ein wie man solch eine on() Funktion umsetzt damit ich dort beim client die zu empfangene Befehle besser trennen kann.

    MfG: Paykoman

    ::EDIT::
    So konnte es doch noch lösen, nach dem ich mir verdeutlicht habe das diese *.on() letztlich jedes mal ne Funktion aufrufen also muss diese entsprechend funktionieren:

    JavaScript-Quellcode

    1. window.WebSocket = window.WebSocket || window.MozWebSocket;
    2. const client = new WebSocket('wss://www.domain.de:8080', ['soap', 'xmpp']);
    3. client.on = function(name, func){ client[name] = func; }; // registriert die Funktionen
    4. client.onmessage = function(event){ client['test'](event.data); } // Funktionen ausführen (noch statisch)
    5. client.emit = function(cmd, data){ } // send handler folgt später
    6. client.on('test', function(data){
    7. console.log('test empfangen mit:', data);
    8. });

    Habe noch eins zwei Probleme zu lösen aber werde dann am Ende noch das vollständige fertige Skript posten, falls es mal wer braucht =)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Paykoman ()

  • Der Anfang ist schon ganz gut, aber mit client[name] kann es sein das du auch Eigenschaften des Websockets umschreibst. Ich hab das ganze mal etwas ergänzt.

    JavaScript-Quellcode

    1. window.WebSocket = window.WebSocket || window.MozWebSocket
    2. const client = new WebSocket('wss://www.domain.de:8080', ['soap', 'xmpp'])
    3. client.listeners = {}
    4. client.on = function(name, func) { // registriert die Funktionen
    5. client.listeners[name] = func
    6. }
    7. client.onmessage = function(event) { // Funktionen ausführen
    8. try {
    9. const data = JSON.parse(event.data)
    10. const listener = client.listeners[data.eventName]
    11. if (listener) listener(data.payload)
    12. } catch (error) {
    13. console.error(error)
    14. }
    15. }
    16. client.emit = function(eventName, payload) { // send handler folgt später
    17. this.send(JSON.stringify({eventName, payload}))
    18. }
    19. client.on('test', function(data) {
    20. console.log('test empfangen mit:', data)
    21. })
    Alles anzeigen

    Es würde aber mehr Sinn machen mit einem richtigen Eventemitter zu arbeiten und einen neuen Prototypen abzuleiten. Dadurch wird das ganze sauberer und universeller.