2016-08-30 36 views
3

私はAngularアプリでTwilioを使用しています。私はユーザーが特定のページにアクセスするたびにTwilioデバイスを初期化しています(顧客のページと呼ぶ)ので、ユーザーは特定の顧客に電話をかけることができます。この初期化関数は、顧客のコントローラに呼び出されます。Twilio.Deviceハンドラが既に存在するかどうかを確認する方法

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機能も再び実行されます。複数の接続/切断/その他。ハンドラは同じデバイスに登録されてしまうため、複数回実行する必要があるものが一度しか実行されません。

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 

:ここ

だからここで私は最初は、顧客のページに移動して、初​​めて_initializeDeviceを呼び出すときに何が起こるかだ...問題を説明するために私のコンソールログのサンプルです

次に、顧客ページから離れて再び移動して、リフレッシュせずにコントローラが初期化コードを再度実行し、ハンドラを複製します。

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(); 
} 

答えて

3

Twilio.Deviceは現在、リスナーの登録を解除していません。これはシングルトンの振る舞いによるものと思われます。これは、将来的に変更される可能性がありますが、今のところ、あなたは直接あなたがバインドされてきたイベントごとに、次を使用してリスナーを削除することができます:Deviceインスタンスは、独自のいくつかのために待機しているよう

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

はないremoveAllListenersに注意してくださいイベント。

+0

申し訳ありませんが少し遅れて戻ってきましたが、Twilio.Device.instance.removeListener( 'disconnect'、disconnectHandler); '(上記のコードと同じ' disconnectHandler')と思われました働くハンドラはまだ2回呼び出されていました。 – chinaowl

+1

気にしないで、私はそれを理解した!最初に 'Twilio.Device.instance._events.connect'を使ってハンドラのインスタンスを取得しなければなりませんでした。 – chinaowl

1

あなたがTwilio.Device.destroy()あなたのハンドラが未登録されていない呼び出したとき、あなたはので、トークンの有効期限の問題が発生している可能性がある場合もう一度Deviceを使用するには、Device.destroy()を呼び出してにnew tokenと電話する必要があります。

接続が終了するもう1つの方法は、Twilio.Device.disconnectAll();を呼び出すことです。ハンドラ関数が実際に終了を処理していない可能性があります。

あなたのトークン設定にチェックインして、問題をより明確に見るのに役立つログ情報を提供したらどうなるか教えてください。

+0

私はトークンのことを調べて、あなたに戻ってきます(ただし、これは問題ではないと思いますが、デフォルトのタイムアウトは1時間です)。 'Twilio.Device。destroy() 'は実際にすべてのハンドラを登録解除すると思われますか?それがハンドラの登録を解除する唯一の方法ですか? – chinaowl

+0

ドキュメントに記載されているとおりに行う必要があります。上記のコードでは見たことのない編集を追加しました。小さな変化ですが、うまくいけばそれはトリックです。私は投稿してください。 –

+0

ハンドラの登録を解除するための説明が書かれていません:「デバイスを破棄し、アクティブな接続と保留中の接続を終了して、オフラインのイベントハンドラをトリガーします」Twilio.Device.setupを呼び出すまで、デバイスは新しい接続を確立または受信できません。 ()もう一度。 'connect'ハンドラと' disconnect'ハンドラの登録を解除/削除する方法や、ハンドラが既に存在するかどうかをチェックしてコントローラが重複ハンドラを登録しないようにする方法について質問しています。 'destroy()'は私が探しているものではないようです。 – chinaowl

関連する問題