我想使用NgRx效果来处理JWT更新,以使this code适应Angular项目。但是我对可观察的事物感到困惑,因为令牌仅更新一次,因为timer
第一次完成。我也尝试过使用delay
运算符,但是由于它不会创建可观察的对象,因此我不知道如何在此流中实现它。有什么想法吗?谢谢!
// auth.effects.ts
@Effect()
renewJWT$: Observable<Action> = this.actions$.pipe(
ofType(ActionTypes.RenewJWT),
filter(() => this.authService.isLoggedIn()),
concatMap(() =>
this.authService.renewJWT().pipe(
map(() => new ScheduleJWTRenewalAction())
)
)
);
@Effect()
scheduleJWTRenewal$: Observable<Action> = this.actions$.pipe(
ofType(
ROOT_EFFECTS_INIT,
ActionTypes.SigninSuccess,
ActionTypes.ScheduleJWTRenewal
),
takeUntil(this.actions$.pipe(ofType(ActionTypes.Logout))),
map(() => Date.parse(this.authService.session.expiresAt) - Date.now()),
filter((remainingTime: number) => remainingTime > 0),
concatMap((remainingTime: number) =>
timer(Math.max(remainingTime, 1)).pipe(
map(() => new RenewJWTAction())
)
)
);
答案 0 :(得分:0)
计时器
签名:计时器(initialDelay:数字|日期,期间:数字, 调度程序:调度程序):可观察
在给定的持续时间后,按指定的顺序发射数字 持续时间。
如果未指定period
,timer
将发出一次并完成。
takeUntil(this.actions$.pipe(ofType(ActionTypes.Logout))),
用户注销scheduleJWTRenewal$
后,流将完成。用户可以再次登录吗? )。
最好在takeUntil
上替换filter
。