如何检查 Twilio.Device 处理程序是不是已存在

Posted

技术标签:

【中文标题】如何检查 Twilio.Device 处理程序是不是已存在【英文标题】:How to check if Twilio.Device handlers already exist如何检查 Twilio.Device 处理程序是否已存在 【发布时间】:2016-08-30 19:48:24 【问题描述】:

我在 Angular 应用程序中使用 Twilio。每当用户访问某个页面(我们称之为客户页面)时,我都会初始化 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();

【问题讨论】:

【参考方案1】:

Twilio.Device 当前不支持取消注册侦听器。似乎这是由于其单例行为。这可能会在未来发生变化,但现在您可以直接使用以下方法为您绑定的每个事件删除侦听器:

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

注意不要removeAllListeners,因为Device 实例正在监听它自己的一些事件。

【讨论】:

抱歉,我回复你有点晚了,但我尝试了Twilio.Device.instance.removeListener('disconnect', disconnectHandler);(与上面代码中的disconnectHandler 相同),但它似乎不起作用。处理程序仍然被调用了两次。 没关系,我想通了!必须首先使用 Twilio.Device.instance._events.connect 获取处理程序的实例。【参考方案2】:

如果当您调用Twilio.Device.destroy() 时,您的处理程序没有被取消注册,您可能会遇到令牌过期问题,因为您需要在调用Device.destroy() 后使用new token 调用Device.setup() 才能再次使用设备。

另一种确保连接终止的方法是调用Twilio.Device.disconnectAll();。也许您的处理程序函数实际上并未处理终止。

请告诉我在您签入令牌设置后的情况,并提供有助于我更清楚地了解问题的任何相关日志信息。

【讨论】:

我将调查令牌问题并回复您(尽管我认为这不是问题,因为我使用的是一小时的默认超时)但现在,我想确认Twilio.Device.destroy() 确实应该注销所有处理程序?这是取消注册处理程序的唯一方法吗? 它应该按照文档所说的那样做。我添加了一个编辑,我在上面的代码中没有看到。是一个很小的变化,但希望它可以解决问题。请随时通知我。 文档没有说明取消注册处理程序的任何内容:“销毁设备。终止活动和挂起的连接。这将触发离线事件处理程序。设备将无法建立或接收新连接,直到您再次调用 Twilio.Device.setup()。”我在询问如何取消注册/删除connectdisconnect 处理程序,或者寻找一种方法来检查这些处理程序是否已经存在,以便控制器不会注册重复的处理程序。看起来destroy() 不是我要找的。​​span> 我可以很好地断开通话(请参阅上面添加的代码)。我认为这与取消注册处理程序无关。

以上是关于如何检查 Twilio.Device 处理程序是不是已存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是有任何 JavaScript 事件侦听器/处理程序附加到元素/文档? [复制]

如何制作一个批处理文件来不断检查程序是不是打开,如果没有,则将其最小化

如何检查批处理文件中是不是存在文件[重复]

如何以编程方式检查 SSAS 数据库/多维数据集是不是正在处理?

如何检查记录器是不是存在

如何检查是不是创建了 jcrop 小部件(裁剪区域)?