我正在使用可锁定服务器上资源的Web应用程序。要解锁它们,它必须使用HTTP DELETE删除服务器上的资源。我知道这是不可靠的,并且还会进行定期清理以使它们解锁,但是目标是尽快解锁资源。

我无法更改锁定体系结构(这不是我的系统),我只需要在解锁时尽力而为即可。

我需要解锁的一点是关闭选项卡或浏览器时。首先,我正在处理onbeforeunload,如果文档脏了,则提示用户确认他们要关闭:

$window.onbeforeunload = function() {
    if (documentIsDirty) {
        return "Some prompt text";
    }
};


我无法从onbeforeunload内解锁,因为用户可能选择取消关闭。但是onbeforeunload和onunload之间没有事件(如果我错了,请纠正我)。

如果我尝试通过onunload进行调用,则onunload函数返回后,制表符/会话将被销毁。麻烦的是,这是在http请求完成之前,事实证明该资源实际上并未被解锁。

$window.onunload = function() {
    $http.delete('/a/lock/url');

    // I've tried forcing a digest cycle to try and flush the request
    // through, but it never gets sent either way
    $rootScope.$digest();
};


现在,我知道实际上阻塞了Javascript是令人厌恶的事情,但似乎一旦onload返回,这就是她所写的全部内容。

有什么方法可以阻止直到HTTP请求实际完成,并阻止onunload在此之前返回?

[更新]
解决方案如下-同步使用XMLHttpRequest。现在已过时,但至少在Chrome中仍然有效(在撰写本文时)。

var request = new XMLHttpRequest();
request.open('DELETE', url, false);
request.setRequestHeader('X-XSRF-TOKEN', myXSRFToken);
request.send();

最佳答案

$ http将始终异步执行请求,因为在内部它仅使用XMLHttpRequest并始终将true作为第三个参数传递给请求的open函数。从XMLHttpRequest's open function的MDN文档中:


  可选的布尔参数,默认为true,指示是否异步执行操作。如果此值为false,则在接收到响应之前,send()方法不会返回。


如果要执行同步请求,则可以直接使用XMLHttpRequest并将false作为第三个参数传递给open。因为这是网站关闭的时间,所以实际上并没有必要使用Angular的$ http。

关于javascript - Javascript/angular:从onunload执行异步http,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41041837/

10-12 13:42