我在使用Twilio的角度应用程序。每当用户访问某个页面(让我们称之为customer页面)时,我都在初始化Twilio设备,以便用户可以调用特定的客户。在customer控制器中调用此初始化函数:
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
然后,我一次又一次地从customer页面导航回来,而不需要刷新,因此控制器再次运行初始化代码并复制处理程序:
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设备上?或者,我应该在我的角度应用程序中的其他地方附加事件处理程序吗?
编辑:作为参考,下面是我如何断开呼叫(附在一个按钮上):
function hangUp() {
Twilio.Device.disconnectAll();
}
发布于 2016-08-31 13:34:32
Twilio.Device目前不支持取消注册侦听器.似乎这是因为它的独生子女行为。这种情况在将来可能会改变,但现在您可以直接对绑定的每个事件使用以下方法删除侦听器:
Twilio.Device.instance.removeListener('eventName', handlerFn);
注意不要使用removeAllListeners
,因为Device
实例正在侦听它自己的一些事件。
发布于 2016-08-30 13:03:57
如果您调用Twilio.Device.destroy()
时,您的处理程序没有未注册,您可能会遇到令牌过期问题,因为您需要在调用Device.destroy()
之后用新令牌调用Device.destroy()
,以便再次使用设备。
另一种确保连接终止的方法是调用Twilio.Device.disconnectAll();
。也许您的处理程序函数实际上并没有处理终止。
请告诉我如何在您签入您的令牌设置,并提供任何相关的日志信息,将帮助我更清楚地看到问题。
https://stackoverflow.com/questions/39235950
复制