【问题标题】:Angular2 trigger observable at certain time在特定时间可观察到的 Angular2 触发器
【发布时间】:2018-12-02 12:33:51
【问题描述】:

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

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

所以现在我的问题是,如果我有一个到期日期,我是否可以编写一个可观察的来触发说到期时间比当前时间早五分钟的时间。这样我就可以在我的信号器服务中订阅那个 observable 并断开并连接到更新的身份验证令牌。如果需要,我可以提供代码示例,但我不知道他们对我的问题有多大帮助。

感谢您对此提供的任何帮助。

【问题讨论】:

    标签: angular angular2-observables subscribe


    【解决方案1】:

    我不了解信号器,但我可以为您的要求提供解决方案。

    你可以从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

    【讨论】:

    • 谢谢你,正是我需要的。
    【解决方案2】:

    这个观察者会这样做

    const tokenTimeout = timeout;
    let currentTime = new Date();
    
    return new Observable(observer => {
    
      while(tokenTimeout > currentTime) {
        currentTime = new Date();
      }
    
      observer.next();
      observer.complete();
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 2017-04-22
      • 2018-05-20
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      相关资源
      最近更新 更多