gpt4 book ai didi

angular - 使用 Angular 关闭浏览器窗口/选项卡时执行异步服务获取

转载 作者:行者123 更新时间:2023-12-02 15:57:29 25 4
gpt4 key购买 nike

我目前正在尝试让 Angular 应用程序在用户尝试离开我的页面时进行 API 服务调用。通过关闭选项卡/窗口,或输入外部 URL。

我尝试过实现我在 stackoverflow 问题上看到的几种不同的方法,但似乎都没有达到预期的效果。有些人提到同步 ajax 请求已经或正在 Chrome 上的 onbeforeunload 中被弃用。其他人建议使用 XMLHttpRequests,它似乎也遭受了同样的命运。我尝试过使用@HostListener('window:onbeforeunload', ['$event']) 以及 HTML (window:beforeunload)="doBeforeUnload($event)" 中的等效项,但所有人都拒绝合作。我可以显示 console.logs,但 API 从未收到任何注销用户的调用。我还使用了 navigator.sendBeacon,尽管它的函数返回 true,表明作业已发送到浏览器队列,但什么也没有实现。

目前注销功能是这样的:

userLogout(): Observable<any> {
return this.apiService.get('/Account/Logout/');
}

这又是一个通用的 http get 函数:

get<T>(url: string, options?: { params: HttpParams }): Observable<any> {
return this.httpRequest<T>('get', url, null, options ? options.params : null);
}

使用 HttpInterceptor 添加完整的 url。注销功能本身正在工作,因为它在菜单选项中使用,在手动使用时可以按预期工作。所以功能应该不是问题。

我想做的就是以同步或异步方式调用 userLogout 函数,并通知后端用户已离开。

最佳答案

经过一番修改,我最终得到了一个基于此 answer 的解决方案,尽管由于某种原因,它在我的第一次尝试中并没有奏效。

我将以下 HostBinding 添加到组件中:

@HostListener('window:beforeunload', ['$event']) beforeunloadHandler(event) {
this.pageClosed();
}

它调用一个简单的函数,该函数将使用身份验证服务注销方法。

pageClosed() {
this.authenticationService.userLogoutSync();
}

我必须创建一个单独的注销函数,以便它可以同步。还必须添加 header 以进行后端授权,因为我的 Http 拦截器无法捕获 XMLHttpRequest 并自行添加它们。

const xhr = new XMLHttpRequest();
xhr.open('GET', environment.backend + '/Account/Logout/', false);
xhr.setRequestHeader('Authorization', 'Bearer ' + this.jwtService.getAccessToken());
xhr.send();
}

关于angular - 使用 Angular 关闭浏览器窗口/选项卡时执行异步服务获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56113875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com