2017-03-29 5 views
0

私のアプリケーションには、ユーザーがこの画面を離れるまで永遠にループするサーバーとクライアントの間の通信を確立するセクションがあります。ユーザーが画面を離れると、私は$rootScope.$on('$stateChangeStart')でこの問題を検出し、$ httpコールを送信してサーバーのプロセスを停止します。AngularJS:タブ/ブラウザでのサーバーコールのクローズ

ユーザーが現在のタブまたはブラウザを閉じるときに同じ$ httpを実行したいが、これを行うことができない。私は$rootScope.$on('$stateChangeStart')またはいくつかの他の点では、この関数を呼び出すとき、それは動作しますが、言ったように

function cancelCommProcess(webId, commActionId) { 
      return $http.get(BASE_URL + '/rest/comm/kill-current-com-process/' + webId + '/' + commActionId) 
      .then(
        function(response) { 
         return response; 
        } 
      ); 
     } 

このすべての最初には、$ HTTP呼び出しを行うサービス機能です。

今、私はタブ/ブラウザを閉じたときに、この関数を呼び出すために、次のコードを持っている:

$window.onbeforeunload = function (evt) { 
      if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
       CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
        .then(
          function() { 
           console.log('HELLO'); 
          } 
        ); 
      } 
     } 

$のHTTP呼び出しがサーバーに到達していないが、私は単純に次の変更を加えた場合は、この方法は、

$window.onbeforeunload = function (evt) { 
      if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
       CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
        .then(
          function() { 
           myTest(); 
          } 
        ); 
      } 
     } 

     function myTest() { 
      console.log('HELLO'); 
     } 

さらに、以前の方法はChromeとFirefoxでは動作しますが、Edgeでは動作しません。もちろん

$window.onbeforeunload = function (evt) { 
    if ($rootScope.CMC_ACTION_IDENTIFIER.CMC_ACTION_MONITORING === currentCommActionId) { 
     CMCService.cancelCommProcess(currentWebId, currentCommActionId) 
      .then(
        function() { 
         myTest(); 
         //console.log('HELLO'); 
        } 
      ); 
    } 
    return ""; 
} 

function myTest() { 
    console.log('HELLO'); 
} 

私はページを残したり、滞在する確認メッセージが表示されますが、私は理由を知りません。しかし、それは私はこのようにそれを行う場合には(私が意味する、$のHTTP呼び出しがサーバに到達した)作品呼び出しはこのメッセージを表示するだけでサーバーに到達します。

私はあなたの助けに感謝するので、これがどのように動作するか分かりません。 $ http呼び出しのアイデアは、現在の通信プロセスを中断するようにサーバーに指示することですが、この方法は真実ではないと感じています。

これに最も適した方法は何ですか?

ありがとうございます。

答えて

0

クライアントとサーバー間で接続を維持し、サーバーでループしないsocket.ioを使用することをお勧めします。

このイベント火災コントローラを使用すると、タブ/ブラウザを閉じたときにこれがトリガされていない、それを

$scope.$on('$destroy', function() { 
    console.log("destory"); 
}); 
+0

を使用することができますDestoryは。 – rocotocloc

関連する問題