关闭浏览器时,我需要发送一个DELETE请求来解锁页面中使用的项目;为此,我使用了onbeforeunload
(规范支持的浏览器仅为Chrome和Firefox)。
如果我在方法上使用return,则会显示一条弹出消息,并且调用正常。
但是,不幸的是,避免出现此弹出消息所需的规范;在这种情况下,当浏览器关闭时,有时它可以工作,有时则不能。
更具体地说,我遇到了以下情况:
当我关闭带有锁定项目的窗口时,调用会对其进行解锁,因此,如果刷新显示相同项目的页面之一,则可以使用。
这是当前“解决方案”所发生的情况:
Firefox:
- Case 1: doesn't unlock the item.
- Case 2: unlock the item.
- Case 3: doesn't unlock the item.
Chrome:
- Case 1: doesn't unlock the item.
- Case 2: unlock the item.
- Case 3: unlock the item.
当前实现为:
$window.onbeforeunload = function(){
MyService.delete({id: item.id}); //The service is defined on another .js
}
其他无效的解决方案:
1)使用onunload
或onclose
代替onbeforeunload
2)这个答案https://stackoverflow.com/a/26275621/8879273是我设法拦截按键事件,但是如果用鼠标关闭了窗口,则它不起作用(而且,每次我将光标移到该项目上时,它都会启动一个删除通话)
我尝试用更改鼠标触发器
$(window).on('click', (function () {
window.onbeforeunload = MyService.delete({ id: item.id });
}));
和
$(window).on('mousedown', (function () {
window.onbeforeunload = MyService.delete({ id: item.id });
}));
但是它仍然不起作用
3)使用延期
$window.onbeforeunload = function (event) {
$scope.closing();
}
$scope.closing = function(){
var deferred = $q.defer();
MyService.delete({ id: item.id }).then(function(response){
deferred.resolved(response);
}, function(error){
deferred.resolved(error);
});
return deferred.promise;
}
4)无奈之下,我已经写了这个( 不要尝试:它可以正常工作...如果您想锁定整个计算机! )
$scope.unlocking = false;
$window.onbeforeunload = function(){
MyService.delete({id: item.id}).then(function(response){
$scope.unlocking = true;
}, function(error){
$scope.unlocking = true; // it doesn't matter if is a successful response or not
});
// since call are async, i've thinked to put a while to wait the response
var res = angular.copy($scope.unlocking);
while(res){
$timeout(function(){
res = angular.copy($scope.unlocking);
}, 100);
}
}
此代码存在的问题是响应返回但while
没有退出。