2016-08-30 4 views
3

Ich benutze Twilio in einer Angular App. Ich initialisiere das Twilio-Gerät immer dann, wenn der Benutzer eine bestimmte Seite besucht (nennen wir es die Kundenseite), damit der Benutzer einen bestimmten Kunden anrufen kann. Diese Initialisierungsfunktion wird im Kunden Controller genannt:Wie überprüft man, ob Twilio.Device Handler bereits existieren

function _initializeDevice(token, connectHandler, disconnectHandler) { 
    console.log('CALLED INITIALIZE DEVICE'); 
    var device = Twilio.Device; 
    device.setup(token, {debug: true}); 
    console.log(device); 

    device.connect(connectHandler); 
    device.disconnect(disconnectHandler); 

    device.offline(function() { 
     _getToken().then(function(result) { 
      device.setup(result.data.token, {debug: true}); 
     }); 
    }); 

    device.error(_handleTwilioError); 
} 

Und das ist die Trenn-Handler, der in oben übergeben wird:

function onDisconnect() { 
    console.log('SAVING CALL'); 
    // code to save call 
} 

Das Problem ist, wenn der Benutzer von der Kundenseite navigiert und Zurück (ohne die Seite neu zu laden), läuft der Kunden-Controller erneut, wodurch die Funktion _initializeDevice ebenfalls erneut ausgeführt wird. Mehrere verbinden/trennen/etc. Behandler werden am selben Gerät angemeldet, was dazu führt, dass Dinge, die nur einmal ausgeführt werden sollten, mehrmals ausgeführt werden.

Hier ist ein Beispiel meiner Konsolenprotokolle ist das Problem zu veranschaulichen ...

Also hier ist was passiert, wenn ich ersten an den Kunden Seite und _initializeDevice das erste Mal anrufen:

CALLED INITIALIZE DEVICE 
[Device] Setting up PStream 
[WSTransport] Opening socket 
[WSTransport] attempting to connect 
[WSTransport] Socket opened 
[PStream] Setting token and publishing listen 
[Device] Stream is ready 
[Device] Found existing Device; using new token but ignoring options 
[PStream] Setting token and publishing listen 
[Twilio.PeerConnection] signalingState is "have-local-offer" 
[Twilio.PeerConnection] signalingState is "stable" 
[Twilio.PeerConnection] iceConnectionState is "checking" 
[Twilio.PeerConnection] iceConnectionState is "connected" 
[Twilio.PeerConnection] iceConnectionState is "completed" 
[Connection] Disconnecting... 
[Twilio.PeerConnection] iceConnectionState is "closed" 
[Twilio.PeerConnection] signalingState is "closed" 
SAVING CALL 

dann navigiere ich von der Kundenseite weg und wieder zurück, ohne erfrischend, so dass die Steuerung des initialize Code wieder läuft und dupliziert die Handler:

CALLED INITIALIZE DEVICE 
[Device] Found existing Device; using new token but ignoring options 
[PStream] Setting token and publishing listen 
CALLED INITIALIZE DEVICE 
[Device] Found existing Device; using new token but ignoring options 
[PStream] Setting token and publishing listen 
[Device] Found existing Device; using new token but ignoring options 
[PStream] Setting token and publishing listen 
[Twilio.PeerConnection] signalingState is "have-local-offer" 
[Twilio.PeerConnection] signalingState is "stable" 
[Twilio.PeerConnection] iceConnectionState is "checking" 
[Twilio.PeerConnection] iceConnectionState is "connected" 
[Twilio.PeerConnection] iceConnectionState is "completed" 
[Connection] Received HANGUP from gateway 
[Connection] Disconnecting... 
[Twilio.PeerConnection] iceConnectionState is "closed" 
[Twilio.PeerConnection] signalingState is "closed" 
SAVING CALL 
SAVING CALL 
SAVING CALL 

Ich habe versucht mit Twilio.Device.destroy(), aber die Handler sind immer noch da.

Wie kann ich überprüfen, ob Handler bereits am Twilio-Gerät angeschlossen sind? Oder soll ich die Event-Handler irgendwo anders in meiner Angular App anhängen?

Edit: als Referenz, hier ist, wie ich Anrufe bin trennen (die auf eine Schaltfläche im Anhang):

function hangUp() { 
    Twilio.Device.disconnectAll(); 
} 

Antwort

3

Twilio.Device unterstützt zur Zeit keine Registrierung von Listenern. Scheint so, als ob dies auf sein Singleton-Verhalten zurückzuführen wäre. Dies kann sich in Zukunft ändern, aber jetzt können Sie die Zuhörer entfernen direkt im folgenden für jedes Ereignis verwenden Sie gebunden haben:

Twilio.Device.instance.removeListener('eventName', handlerFn); 

darauf achten, nicht zu removeAllListeners wie die Device Instanz für einige seiner eigenen hören Veranstaltungen.

+0

Tut mir leid, dass ich etwas zu spät zu Ihnen zurückkomme, aber ich habe 'Twilio.Device.instance.removeListener ('disconnect', disconnectHandler);' (derselbe 'disconnectHandler' aus dem obigen Code) versucht und es schien nicht arbeiten. Der Hundeführer wurde noch zweimal angerufen. – chinaowl

+1

Egal, ich habe es herausgefunden! Musste zuerst eine Instanz des Handlers mit 'Twilio.Device.instance._events.connect' holen. – chinaowl

1

Wenn Sie bei einem Anruf Twilio.Device.destroy() Ihre Handler werden nicht unregistrierte sein, können Sie Token Ablauf Probleme erleben, weil Sie müssen Device.setup() mit einem new token aufrufen, nachdem Sie Device.destroy() aufgerufen haben, um das Gerät erneut zu verwenden.

Eine andere Methode, um sicherzustellen, dass Verbindungen terminiert sind, wäre Twilio.Device.disconnectAll();. Vielleicht behandelt Ihre Handler-Funktion die Beendigung nicht wirklich.

Bitte sagen Sie mir, wie es weitergeht, nachdem Sie in Ihrem Token-Setup eingecheckt und relevante Protokollinformationen bereitgestellt haben, die mir helfen, das Problem klarer zu sehen.

+0

Ich werde in das Token-Ding schauen und zu Ihnen zurückkommen (obwohl ich nicht glaube, dass das das Problem ist, da ich das Standard-Timeout von einer Stunde verwende), aber jetzt wollte ich das bestätigen 'Twilio.Device.destroy() 'soll tatsächlich alle Handler abmelden? Und ist das die einzige Möglichkeit, einen Handler abzumelden? – chinaowl

+0

Es sollte tun, was die Dokumentation sagt. Ich habe eine Änderung hinzugefügt, die ich oben in Ihrem Code nicht gesehen habe. Ist eine kleine Änderung, aber hoffentlich macht es den Trick. Bitte halten Sie mich auf dem Laufenden. –

+0

Die Dokumentation sagt nichts über das Aufheben der Registrierung von Handlern aus: "Zerstört das Gerät. Beendet aktive und ausstehende Verbindungen. Dadurch wird der Offline-Ereignishandler ausgelöst. Gerät kann keine neuen Verbindungen herstellen oder empfangen, bis Sie Twilio.Device.setup aufrufen() nochmal." Ich frage, wie ich die Aufhebung der Registrierung/Löschen der 'connect' und' disconnect' Handler, oder für eine Möglichkeit, um zu überprüfen, ob diese Handler bereits existieren, so dass der Controller keine doppelten Handler registriert. Es sieht aus wie 'destroy()' ist nicht was ich suche. – chinaowl

Verwandte Themen