Как проверить, существуют ли уже обработчики Twilio.Device

Я использую 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();
}

person chinaowl    schedule 30.08.2016    source источник


Ответы (2)


В настоящее время Twilio.Device не поддерживает отмену регистрации прослушивателей. Похоже, это было связано с его одноэлементным поведением. Это может измениться в будущем, но сейчас вы можете удалить прослушиватели напрямую, используя следующее для каждого связанного события:

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

Будьте осторожны, чтобы не removeAllListeners, так как экземпляр Device прослушивал некоторые из своих собственных событий.

person rrowland    schedule 31.08.2016
comment
Извините, что вернусь к вам с опозданием, но я попробовал Twilio.Device.instance.removeListener('disconnect', disconnectHandler); (тот же disconnectHandler из приведенного выше кода), и это не сработало. Обработчик по-прежнему вызывался дважды. - person chinaowl; 07.09.2016
comment
Ничего, я разобрался! Пришлось сначала получить экземпляр обработчика, используя Twilio.Device.instance._events.connect. - person chinaowl; 07.09.2016

Если при вызове Twilio.Device.destroy() ваши обработчики не отменяются, вы можете возникают проблемы с истечением срока действия токена, поскольку вам необходимо вызвать Device.setup() с новый токен после вызова Device.destroy(), чтобы снова использовать Устройство.

Другим способом обеспечения разрыва соединений может быть вызов Twilio.Device.disconnectAll();. Возможно, ваша функция-обработчик на самом деле не обрабатывает завершение.

Пожалуйста, расскажите мне, как это происходит после проверки настройки вашего токена, и предоставьте любую соответствующую информацию журнала, которая поможет мне более четко увидеть проблему.

person Megan Speir    schedule 30.08.2016
comment
Я собираюсь изучить токен и вернуться к вам (хотя я не думаю, что это проблема, так как я использую время ожидания по умолчанию в один час), но сейчас я хотел подтвердить, что Twilio.Device.destroy() действительно предполагается отменить регистрацию всех обработчиков? И это единственный способ отменить регистрацию обработчика? - person chinaowl; 31.08.2016
comment
Это должно делать, как говорится в документации. Я добавил правку, которую не видел в вашем коде выше. Это небольшое изменение, но, надеюсь, оно поможет. Пожалуйста, держите меня в курсе. - person Megan Speir; 31.08.2016
comment
В документации ничего не сказано об отмене регистрации обработчиков: Уничтожает устройство. Завершает активные и ожидающие подключения. Это вызовет автономный обработчик событий. Устройство не сможет устанавливать или принимать новые соединения, пока вы снова не вызовете Twilio.Device.setup(). Я спрашиваю, как я могу отменить регистрацию/удаление обработчиков connect и disconnect или как проверить, существуют ли уже эти обработчики, чтобы контроллер не регистрировал повторяющиеся обработчики. Похоже, destroy() не то, что я ищу. - person chinaowl; 31.08.2016
comment
Я отлично отключаю вызов (см. Добавленный код выше). Я не думаю, что это связано с отменой регистрации обработчиков. - person chinaowl; 31.08.2016