Angular2触发器在特定时间可观察

Angular2 trigger observable at certain time

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

登录后使用 signalr,我们建立连接并发送不记名令牌作为查询字符串的一部分。但是,由于 signalr 是独立的,因此不使用 angular 的 http 客户端,因此不会命中 url 拦截器。我一直在考虑不同的方法来处理这个问题,对我来说最干净的方法是订阅一个在令牌过期时触发的可观察对象。

所以现在我的问题是,如果我有一个到期日期,我可以编写一个可观察对象来触发说什么时候到期时间比当前时间早五分钟。通过这种方式,我可以在我的信号器服务中订阅该可观察对象,并断开连接并连接更新的授权令牌。如果需要,我可以提供代码示例,但我不知道他们对我的问题有多大帮助。

感谢您对此的任何帮助。

这个观察者会那样做

const tokenTimeout = timeout;
let currentTime = new Date();

return new Observable(observer => {

  while(tokenTimeout > currentTime) {
    currentTime = new Date();
  }

  observer.next();
  observer.complete();
});

作为替代方案,当您在服务器上注册客户端连接时,在客户端注册时注册他们的令牌超时,然后在向客户端发送消息时检查超时,如果超时,首先向客户端更新他们的令牌,然后在 JS 的客户端有一个更新令牌的方法。 article 讨论注册客户端连接。我认为这将不太可能失败。

我不了解 signalr,但我可以根据您的要求提供解决方案。

您可以使用 rxjs 中的 timer,这就像 setTimeout(),但只是一个 Observable。

expirationDate 和另一个在到期日期前五分钟创建日期对象。减去它们得到 Observable 应该触发的时间。

time 以毫秒为单位传递给您可以进行订阅的计时器。 API 调用完成后,再次调用相同的方法重新初始化计时器。

timerSubs: Subscription;  // to cancel existing timer   
ngOnInit() {
    this.calculateTimeForTimer()
}

calculateTimeForTimer() {
    let expirationDate = new Date();
    expirationDate.setTime(expirationDate.getTime() + 10 * 1000); // 10 seconds from now.
    // in your case use your own duration/date of expiration
    let alertDate = new Date(expirationDate);
    alertDate.setTime(alertDate.getTime() - 5 * 1000); // 5 seconds before expiration
    // in your case subtract 5 minutes instead of 5 seconds
    let timeDuration = (expirationDate.getTime() - alertDate.getTime());
    this._startTimer(timeDuration);
}

private _startTimer(timeDuration) {
    if (this.timerSubs) {
        this.timerSubs.unsubscribe();
    }

    this.timerSubs = timer(timeDuration).subscribe((data) => {
      // make the API call, and then calculate appropriate duartion and call startTimer() again
      of("This is your new Token").pipe(delay(2000)).subscribe((apiData) => {
          console.log("Data from API", apiData);
          this.calculateTimeForTimer();
      })
    })
}

在这里查看示例,它有 10 秒作为当前时间的到期日期。 https://stackblitz.com/edit/angular-bhupgg