Я использую Twilio в приложении Angular. Я инициализирую устройство Twilio всякий раз, когда пользователь посещает определенную страницу (назовем ее страницей клиента), чтобы пользователь мог позвонить конкретному клиенту. Эта функция инициализации вызывается в клиентском контроллере:
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);
}
И это обработчик отключения, который передается выше:
function onDisconnect() {
console.log('SAVING CALL');
// code to save call
}
Проблема в том, что всякий раз, когда пользователь переходит со страницы клиента и обратно (без обновления страницы), контроллер клиента запускается снова, вызывая повторный запуск функции _initializeDevice
. Несколько подключений/отключений/и т.д. обработчики в конечном итоге регистрируются на одном и том же устройстве, что приводит к тому, что вещи, которые должны запускаться только один раз, выполняются несколько раз.
Вот пример моих журналов консоли, чтобы проиллюстрировать проблему...
Итак, вот что происходит, когда я сначала перехожу на страницу клиента и звоню _initializeDevice
в первый раз:
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
Затем я ухожу со страницы клиента и возвращаюсь обратно без обновления, поэтому контроллер снова запускает код инициализации и дублирует обработчики:
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
Я пытался использоватьTwilio.Device.destroy()
, но обработчики все еще там.
Как я могу проверить, были ли обработчики уже подключены к устройству Twilio? Или я должен прикреплять обработчики событий где-то еще в моем приложении Angular?
Редактировать: для справки, вот как я отключаю вызовы (прикрепленные к кнопке):
function hangUp() {
Twilio.Device.disconnectAll();
}