如何检查 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()。”我在询问如何取消注册/删除connect
和disconnect
处理程序,或者寻找一种方法来检查这些处理程序是否已经存在,以便控制器不会注册重复的处理程序。看起来destroy()
不是我要找的。span>
我可以很好地断开通话(请参阅上面添加的代码)。我认为这与取消注册处理程序无关。以上是关于如何检查 Twilio.Device 处理程序是不是已存在的主要内容,如果未能解决你的问题,请参考以下文章
如何检查是不是有任何 JavaScript 事件侦听器/处理程序附加到元素/文档? [复制]
如何制作一个批处理文件来不断检查程序是不是打开,如果没有,则将其最小化