我想为Angular项目调整这段代码,使用NgRx效果来处理JWT更新。但是我被可观察量困住了,因为令牌只更新一次,因为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())
)
)
);
计时器
签名:计时器(初始延迟:数字 |日期、期间:数字、 调度程序:调度程序:可观察
给定持续时间后,按每个指定的顺序发出数字 期间。
如果未指定period
timer
将发出一次并完成。
takeUntil(this.actions$.pipe(ofType(ActionTypes.Logout))),
用户注销后scheduleJWTRenewal$
流将完成。用户可以再次登录吗?) .
最好在filter
上替换takeUntil
.