AngularJS:选项卡/浏览器关闭时的服务器调用

时间:2017-03-29 14:11:56

标签: angularjs

我的应用程序中有一个部分,我在服务器和客户端之间建立通信,直到用户离开此屏幕为止。当用户离开屏幕时,我使用$rootScope.$on('$stateChangeStart')检测到此问题并发送$ http调用以停止服务器中的进程。

我想在用户关闭当前标签或浏览器时执行相同的$ http,但我无法完成此操作。

首先,这是进行$ http调用的服务函数:

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

正如我所说,当我在$rootScope.$on('$stateChangeStart')或其他一些方面调用此函数时,它会起作用。

现在,当关闭标签/浏览器时,我有以下代码来调用此函数:

$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。但它的工作原理(我的意思是,$ http调用到达服务器)如​​果我这样做:

$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调用的想法是告诉服务器中断当前的通信过程,但我觉得这种方法不真实。

你能帮我弄清楚最好的办法是什么吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我建议你使用socket.io来保持客户端和服务器之间的连接,而不是在服务器中循环。

当控制器崩溃时你可以使用它来触发此事件

$scope.$on('$destroy', function() {
   console.log("destory");
});
相关问题