2016-07-30 29 views
0

Ich führe einen WebSocket-Server mit ws aus und versuche eingehende Nachrichten aufzuteilen, je nachdem, ob sie JSON sind oder nicht.Hinzufügen von Listener zum Objektprototyp

function determineJSON(m) { 
    try   { return ['json', JSON.parse(m)] } 
    catch (err) { return ['not-json', m] } 
} 

wss.on('connection', ws => { 
    ws.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
    .on('json', j => { ... }) 
    .on('not-json', m => { ... }) 
}) 

Der Code funktioniert gut, aber ich habe mich gefragt, wie ich die .on('message', ...) Zuhörer in die WS Klasse hinzufügen könnte, so dass alle neuen WS Objekte, die es haben würde. Ich versuchte WS.prototype.on('message', ...), aber das schien nichts zu tun.

+1

Erstellen Sie eine Unterklasse, und fügen Sie sie im Konstruktor hinzu. – Bergi

Antwort

0

Nun, ich bin kein großer Fan von den Prototyp zu modifizieren, so dass Sie so etwas tun:

function determineJSON(m) { 
    try   { return ['json', JSON.parse(m)] } 
    catch (err) { return ['not-json', m] } 
} 

function decorateWS(ws) { 
    return ws.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
} 

wss.on('connection', ws => { 
    decorateWS(ws).on('json', j => { ... }) 
        .on('not-json', m => { ... }) 
}) 

Wie auch immer, wenn Sie die Klasse ändern möchten sich Ihnen wahrscheinlich wie etwas tun müssen:

let origConstructor = ws.prototype.constructor; 
WS.prototype.constructor =() => { 
    origConstructor.apply(this, arguments); 
    const ws = this; 
    this.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
} 

In jedem Fall denke ich, dass dies Nebenwirkungen haben könnte. Der Dekorationsansatz sieht also viel besser und wartbarer aus.

1

Eigentlich möchten Sie Instanzen von WS mit vordefinierten Status erstellen?

Zu diesem Zweck würde ich Ihnen vorschlagen, nur eine Fabrik zu erstellen, die es für Sie behandeln würde.

WsFactory.create = function() { 
    var ws = new WS(); //or whatever you use for creating 
    ws.on(...); 
    return ws; 
} 

Sie würden vermeiden, Prototypen zu mutieren, und würden erhalten, was Sie haben möchten.