如何使用与 angular2 http 服务的保持连接
Posted
技术标签:
【中文标题】如何使用与 angular2 http 服务的保持连接【英文标题】:how to use keep alive connection with angular2 http service 【发布时间】:2018-03-21 22:24:25 【问题描述】:我制作了一个 Angular 应用程序,它每两秒发出一次 http GET 请求以更新仪表板。但我经常收到 HTTP 错误 429(请求过多)。
我在 Firefox 开发者工具中看到请求是“保持活动状态”,时间为 5 秒,所以我认为每个调用都是打开与服务器的连接而不是重用它
如何告诉 Angular 重用连接?或者如何避免429?只有 3 或 4 个并发客户端。
相关代码如下:
ngOnInit()
this.interval = Observable.interval(environment.dashboard_refresh_rate).subscribe(x =>
this.getLockersFromService();
);
this.getLockersFromService();
ngOnDestroy()
this.interval.unsubscribe();
getLockersFromService()
this.http.get('/dashboard').subscribe(
data =>
this.showDashboard(data);
,
(err: HttpErrorResponse) =>
this.showErrorResponse(err);
);
【问题讨论】:
听起来像是 websockets 的案例developer.mozilla.org/en-US/docs/Web/API/WebSockets_API 是的@jbrown,但我的后端在 Laravel (php) 中。我认为在 PHP 中实现 websocket 很复杂。我不认为我可以拥有一个长寿的 php 进程。 laravel.com/docs/5.5/broadcasting 【参考方案1】:这是我使用的一个简单的过期实现。
它有一个会话并将会话发送到后端(每 30 秒)。如果弹出成功消息,logoutTimer 会增加 15 分钟。如果日期高于 logoutTimer 那么它将自动注销。
localStorage 用于,如果您在主页上再次打开它,您的会话可以通过 timeFithTeen 重新激活。
constructor(private router: Router, private soap: SoapRequest) //soap is your rest
if (localStorage.getItem('logoutTimer') === null)
this.timeFithTeen();
ngOnInit()
Observable.timer(2000, 30000).subscribe(t =>
let date = new Date();
this.soap.keepAlive().then((response: any) =>
localStorage.removeItem('logoutTimer');
this.timeFithTeen();
), ((error: any) =>
console.log(error);
);
if (date >= new Date(localStorage.getItem('logoutTimer')))
localStorage.removeItem('sessionExpired');
localStorage.setItem('sessionExpired', 'Session expired');
this.router.navigateByUrl('/login');
);
private timeFithTeen()
let logoutTimer = new Date();
logoutTimer.setMinutes(logoutTimer.getMinutes() + 15);
localStorage.setItem('logoutTimer', logoutTimer.toString());
【讨论】:
以上是关于如何使用与 angular2 http 服务的保持连接的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ExpressJS 服务器与 Angular2 集成