我的应用程序中有一个部分,我在服务器和客户端之间建立通信,直到用户离开此屏幕为止。当用户离开屏幕时,我使用$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调用的想法是告诉服务器中断当前的通信过程,但我觉得这种方法不真实。
你能帮我弄清楚最好的办法是什么吗?
谢谢。
答案 0 :(得分:0)
我建议你使用socket.io来保持客户端和服务器之间的连接,而不是在服务器中循环。
当控制器崩溃时你可以使用它来触发此事件
$scope.$on('$destroy', function() {
console.log("destory");
});