Триггер Angular2, наблюдаемый в определенное время - PullRequest
0 голосов
/ 02 декабря 2018

Итак, сначала немного контекста.У меня угловая 2 приборная панель, она сидит за логином и имеет встроенный сигнализатор.Для запроса, отправленного через http-клиент angular, я могу использовать проверку перехватчика URL-адреса, если токен истек, и если это так, запросить новый токен из API.Это прекрасно работает для всех аутентифицированных вызовов, кроме как с сигнализатором.

С помощью сигнализатора при входе в систему мы устанавливаем соединение и отправляем токен-носитель как часть строки запроса.Однако, поскольку сигнализатор является отдельным, он не использует угловой клиент http и, следовательно, URL-перехватчик не используется.Я думал о разных способах справиться с этим, и для меня самым чистым было бы подписаться на наблюдаемое, которое срабатывает, когда токен истекает.

Так что теперь мой вопрос: есть ли у меня дата истечения срока, могу ли янаписать заметку, которую триггеры говорят, когда время истечения составляет пять минут до текущего времени.Таким образом, я мог подписаться на это в моей службе сигнализатора, отключиться и подключиться с обновленным токеном авторизации.При необходимости я могу предоставить примеры кода, но я не знаю, насколько они помогут с моим вопросом.

Спасибо за любую помощь в этом.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Я не знаю о сигнализаторе, но могу дать решение по вашему требованию.

Вы можете использовать timer из rxjs, это похоже на setTimeout(), но просто на наблюдаемое.

Создание объектов Date для 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

0 голосов
/ 02 декабря 2018

Этот наблюдатель будет делать это

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

return new Observable(observer => {

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

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

В качестве альтернативы, когда вы регистрируете клиентское соединение на сервере, зарегистрируйте свое время ожидания токена при регистрации клиента, затем при отправке сообщения клиенту проверьтетайм-аут, и если он истек, сначала отправьте сообщение клиенту, чтобы обновить его токен, затем на стороне клиента в JS есть метод, который обновляет токен.Эта статья рассказывает о регистрации клиентских подключений.Я думаю, что у этого было бы меньше возможностей потерпеть неудачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...