Angular2触发器在特定时间可见

时间:2018-12-02 12:33:51

标签: angular angular2-observables subscribe

因此,首先是一些上下文。我有一个Angle 2仪表板,它位于登录名后面,并且也集成了Signalr。对于通过angular的http客户端发送的请求,我可以使用url拦截器来检查令牌是否已过期,如果是,则从api请求新令牌。这对于除信号器以外的所有已验证呼叫均适用。

在登录时使用signalr建立连接,并发送承载令牌作为查询字符串的一部分。但是,由于signalr是单独的,因此不使用angular的http客户端,因此不会拦截url拦截器。我一直在思考处理此问题的不同方法,对我而言,最干净的方法是订阅在令牌到期时触发的可观察对象。

所以现在我的问题是,如果我有一个失效日期,我可以写一个可观察值来触发说何时失效时间比当前时间早五分钟。这样,我可以订阅我的Signalr服务中的可观察对象,并断开连接并与更新的auth令牌连接。如果需要,我可以提供代码示例,但我不知道他们对我的问题有多大帮助。

谢谢您的帮助。

2 个答案:

答案 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讨论了注册客户端连接。我认为这样做失败的可能性较小。