ngrx 效果 - 问题 calling/stopping 每隔几秒有条件地效果
ngrx effects - problems calling/stopping effects conditionally every few seconds
我正在尽力启用我的 ngrx 效果,使用计时器按以下方式每 2 秒有条件地调用一次自身:
@Effect()
loadSummary$ = this.actions$
.pipe(
ofType(SummaryTypes.SAVE_SUMMARY),
switchMap((action:any) => (action.running ? timer(0, 2000) : NEVER)),
switchMap((action: any) => {
console.log(action); /* prints 0 (how is this possible?!) */
return this.analyticsService.getData(action.fetchArr, action.startAndEndDate).pipe(
catchError((err) => {
/* log error */
}),
)
}),
)
所以我每 2 秒调用第二个 switchMap。 action.running
在第一次 switchMap 调用中也正确 returns true 或 false,但是,console.log(action)
returns 0 类似地,action.fetchArr
和 action.startAndDate
return未定义。
这是因为我无法 return 第一 action
到第二个动作。有人可以指导我做错了什么吗?
我想要的:
我希望我的效果每 2 秒调用一次,如果 action.running
return 为 false 则它必须立即停止。 console.log(action);
应该正确 return 第二个传递的对象 switchMap
而不是 0.
我试过的:
尝试阅读最近几个小时的效果,甚至尝试使用 takeUntil
但无法找到任何特定方法。
嗨,我试过这样的东西并且成功了
public someSubject = new Subject<boolean>();
public someObes = from([1, 2, 3, 4]);
ngOnInit() {
this.someSubject
.pipe(
switchMap(
(value: boolean): any =>
timer(0, 200).pipe(
filter(() => value),
switchMap((): any => this.someObes)
)
)
)
.subscribe(value => console.log(value));
this.someSubject.next(true);
setTimeout(() => this.someSubject.next(false), 3 * 1000);
setTimeout(() => this.someSubject.next(true), 5 * 1000);
setTimeout(() => this.someSubject.next(false), 8 * 1000);
}
}
我认为你应该 pipe
timer(0, 2000)
为了真正解决你的误解:
.console.log(action); /* prints 0 (how is this possible?!) */
在switchMap中
在此步骤之前,您将切换到可观察计时器和 returns 一个 运行 数字。检查那里的动作类型。它只是不是你所期望的那样。
我认为这应该可以解决问题:
switchMap((action: any) =>
(action.running ? timer(0, 2000) : NEVER)
.pipe(map(() => action))),
switchMap((action: any) => { // now this is actually of type 'Action'
console.log(action);
我正在尽力启用我的 ngrx 效果,使用计时器按以下方式每 2 秒有条件地调用一次自身:
@Effect()
loadSummary$ = this.actions$
.pipe(
ofType(SummaryTypes.SAVE_SUMMARY),
switchMap((action:any) => (action.running ? timer(0, 2000) : NEVER)),
switchMap((action: any) => {
console.log(action); /* prints 0 (how is this possible?!) */
return this.analyticsService.getData(action.fetchArr, action.startAndEndDate).pipe(
catchError((err) => {
/* log error */
}),
)
}),
)
所以我每 2 秒调用第二个 switchMap。 action.running
在第一次 switchMap 调用中也正确 returns true 或 false,但是,console.log(action)
returns 0 类似地,action.fetchArr
和 action.startAndDate
return未定义。
这是因为我无法 return 第一 action
到第二个动作。有人可以指导我做错了什么吗?
我想要的:
我希望我的效果每 2 秒调用一次,如果 action.running
return 为 false 则它必须立即停止。 console.log(action);
应该正确 return 第二个传递的对象 switchMap
而不是 0.
我试过的:
尝试阅读最近几个小时的效果,甚至尝试使用 takeUntil
但无法找到任何特定方法。
嗨,我试过这样的东西并且成功了
public someSubject = new Subject<boolean>();
public someObes = from([1, 2, 3, 4]);
ngOnInit() {
this.someSubject
.pipe(
switchMap(
(value: boolean): any =>
timer(0, 200).pipe(
filter(() => value),
switchMap((): any => this.someObes)
)
)
)
.subscribe(value => console.log(value));
this.someSubject.next(true);
setTimeout(() => this.someSubject.next(false), 3 * 1000);
setTimeout(() => this.someSubject.next(true), 5 * 1000);
setTimeout(() => this.someSubject.next(false), 8 * 1000);
}
}
我认为你应该 pipe
timer(0, 2000)
为了真正解决你的误解:
.console.log(action); /* prints 0 (how is this possible?!) */
在switchMap中
在此步骤之前,您将切换到可观察计时器和 returns 一个 运行 数字。检查那里的动作类型。它只是不是你所期望的那样。
我认为这应该可以解决问题:
switchMap((action: any) =>
(action.running ? timer(0, 2000) : NEVER)
.pipe(map(() => action))),
switchMap((action: any) => { // now this is actually of type 'Action'
console.log(action);