因此,首先是一些上下文。我有一个Angle 2仪表板,它位于登录名后面,并且也集成了Signalr。对于通过angular的http客户端发送的请求,我可以使用url拦截器来检查令牌是否已过期,如果是,则从api请求新令牌。这对于除信号器以外的所有已验证呼叫均适用。
在登录时使用signalr建立连接,并发送承载令牌作为查询字符串的一部分。但是,由于signalr是单独的,因此不使用angular的http客户端,因此不会拦截url拦截器。我一直在思考处理此问题的不同方法,对我而言,最干净的方法是订阅在令牌到期时触发的可观察对象。
所以现在我的问题是,如果我有一个失效日期,我可以写一个可观察值来触发说何时失效时间比当前时间早五分钟。这样,我可以订阅我的Signalr服务中的可观察对象,并断开连接并与更新的auth令牌连接。如果需要,我可以提供代码示例,但我不知道他们对我的问题有多大帮助。
谢谢您的帮助。
答案 0 :(得分:1)
我不知道信号器,但是我可以为您的要求提供解决方案。
您可以使用.parent {
display: table;
margin: 0 auto;
}
<div class="parent">
<a class="sss" href="#">parent</a>
<div class="toggle-c" style="display:none">Togglable 1</div>
</div>
中的timer
,就像rxjs
一样,只是一个可观察对象。
为setTimeout()
创建日期对象,并在到期日期前五分钟创建另一个对象。减去它们以找出Observable应该触发的时间。
将毫秒内的expirationDate
传递给计时器,您可以在其中进行订阅。 API调用完成后,再次调用相同的方法以重新初始化计时器。
time
在此处查看示例,它具有从当前时间起的10秒钟作为截止日期。 https://stackblitz.com/edit/angular-bhupgg
答案 1 :(得分:0)
这位观察员会这样做
const tokenTimeout = timeout;
let currentTime = new Date();
return new Observable(observer => {
while(tokenTimeout > currentTime) {
currentTime = new Date();
}
observer.next();
observer.complete();
});
或者,当您在服务器上注册客户端连接时,将其令牌超时与客户端注册一起注册,然后在向客户端发送消息时检查超时,如果超时,则首先向客户端发送消息至更新令牌,然后在JS的客户端上有一种方法来更新令牌。 article讨论了注册客户端连接。我认为这样做失败的可能性较小。