Вы действительно близки, interval(...)
уже создает излучение на неопределенный срок, однако take(1)
вызывает завершение всего наблюдаемого после первого излучения.
Если вы удалите take(1)
ваш код внутри map
будет вызываться с вашим интервалом навсегда.
map
- это полезная функция, когда вы хотите взять значения, излучаемые в наблюдаемой, и преобразовать их в новое значение синхронно, подобно тому, как Array.map()
работает. Поскольку вы работаете с наблюдаемыми внутри этой карты, мы можем использовать что-то вроде mergeMap()
, которое будет автоматически обрабатывать подписку и передачу значений.
setRenewalInterval() {
// ...
return this.timerSub = interval(CUSTOM_INTERVAL * 1000)
.pipe(
mergeMap(() => {
if (this.isLoggedIn && !tokenHelper.isTokenExpired()) {
return this.getNewToken();
} else {
return this.setLogOut();
}
})
)
.subscribe(x => {
// x is the result of every call to getNewToken() or setLogOut()
});
}