在Angular 4中关闭窗口时注销

Adr*_*ien 5 http synchronous angular

我有一个Angular 4应用程序,我想在用户关闭页面(浏览器的窗口或选项卡)时调用注销功能。

这是我的注销功能:

    let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));

    let headers = new Headers({ 'Authorization': 'Basic ' +  btoa(currentUser.login + ":" + currentUser.password),
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'access-control-allow-headers, access-control-allow-origin, content-type, authorization'
    });

    let opts = new RequestOptions();
    opts.headers = headers;


   return this.http.get(this.route + 'UserLogout', opts).map((response: Response) => response.json());
}
Run Code Online (Sandbox Code Playgroud)

在我的app.component.ts中,我有:

@HostListener('window:beforeunload', ['$event'])
beforeUnloadHander(event) {
    this.authenticationService.logoutOnClose().subscribe(res=> {
        localStorage.removeItem('currentUser');
    });

}
Run Code Online (Sandbox Code Playgroud)

但是窗口是关闭的,请求从未完成。我想我需要同步执行请求,但我不知道该怎么做。

你有想法吗 ?

编辑 我尝试使用jQuery:

 ngOnDestroy(){
    let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));
    $.ajax({ url: 'myURL',
        beforeSend: function(request) {
            request.setRequestHeader("Authority", 'Basic ' +  btoa(currentUser.login + ":" + currentUser.password));
            request.setRequestHeader('Content-Type', 'application/json');
            request.setRequestHeader('Access-Control-Allow-Origin', '*');
            request.setRequestHeader('Access-Control-Allow-Headers', 'access-control-allow-headers, access-control-allow-origin, content-type, authorization');
        },
        type: 'GET',
        success: function (result) {
        alert('test');
        localStorage.removeItem('currentUser');
    }, async: false });
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ien 6

我找到了怎么做。因此,我希望避免使用Angular jQuery,但像Sriram Jayaraman一样,我没有找到其他解决问题的方法。但是这些功能@HostListener('window:beforeunload')并@HostListener('window:onunload')没有起作用。

因此,在我的app.component.ts的ngOnInit中,我向beforeunload窗口添加了一个事件侦听器,如果用户已连接,我将调用一个进行Ajax调用的函数。

这是我的代码:

ngOnInit() {
    let context = this;
    window.addEventListener("beforeunload", function (e) {
        let currentUser : User = JSON.parse(localStorage.getItem('currentUser'));
        if(currentUser){
            context.logoutOnClose();
        }
    });
}

logoutOnClose(){
    let currentUser: User = JSON.parse(localStorage.getItem('currentUser'));
    $.ajax({ url: 'myURL',
    beforeSend: function(request) {
        request.setRequestHeader("Authorization", 'Basic ' +  btoa(currentUser.login + ":" + currentUser.password));
        request.setRequestHeader('Content-Type', 'application/json');
        request.setRequestHeader('Access-Control-Allow-Origin', '*');
        request.setRequestHeader('Access-Control-Allow-Headers', 'access-control-allow-headers, access-control-allow-origin, content-type, authorization');
    },
    type: 'GET',
        success: function (result) {
        localStorage.removeItem('currentUser');
    },
    async: false });
}
Run Code Online (Sandbox Code Playgroud)