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();
}
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
Egal, ich habe es herausgefunden! Musste zuerst eine Instanz des Handlers mit 'Twilio.Device.instance._events.connect' holen. – chinaowl