Rxjs NGRX效应和作用顺序
我的目标是有效地处理两个并行操作 action1只生成一次。action2生成了几次,但我只需要生成action1时的最后一个值。 如果action2先生成action1,然后再生成action1,我所面临的问题将如预期的那样出现在控制台“action3”中。但是,如果先生成action1,然后生成action2,我们将不会在控制台中看到“action3”Rxjs NGRX效应和作用顺序,rxjs,ngrx,Rxjs,Ngrx,我的目标是有效地处理两个并行操作 action1只生成一次。action2生成了几次,但我只需要生成action1时的最后一个值。 如果action2先生成action1,然后再生成action1,我所面临的问题将如预期的那样出现在控制台“action3”中。但是,如果先生成action1,然后生成action2,我们将不会在控制台中看到“action3” testEffect$ = createEffect( () => this.actions$.pipe(
testEffect$ = createEffect(
() =>
this.actions$.pipe(
ofType(action1),
tap((act) => window.console.log('action1')),
withLatestFrom(
this.actions$.pipe(
ofType(action2),
tap((act) => window.console.log('action2'))
)
),
tap((act) => window.console.log('action3')),
mapTo(action3)
),
{ dispatch: false }
);
constructor(private readonly actions$: Actions) {}
我希望在这两种情况下都能看到“action3”,但如果action2是在之后生成的,则似乎是action1的最新过滤器
为什么会发生这种情况以及如何修复它?关于withLatestFrom
对于withLatestFrom
,在输出可观察对象发出值之前,所有输入可观察对象必须发出至少一个值
此外:
每当源观测值发出一个值时,它就会使用该值加上其他输入观测值的最新值计算一个公式,然后发出该公式的输出
其效果是,如果源发出一个值,并且没有来自其他输入观测值的最新值->什么也不会发生。它只是等待源再次发射
一种可能的解决办法: 如果您的其他可观察输入尚未发出值,则为其提供一个默认值作为依据。这可以通过多种方式完成,但如果不需要更改默认值,则startWith非常简单,效果很好
withLatestFrom(
this.actions$.pipe(
ofType(action2),
startWith(null),
tap(_ => console.log('action2'))
)
),
当然,null并不是action2的一个很好的默认值。如果这有助于以后的逻辑,您可以使用语义上更有意义的内容
旁白: 另一方面,
MapTo(action3)
否定了你正在做的工作,所以我真的不知道你为什么有这样的要求
将两个观察值合并,然后忽略输出。为什么不干脆做:
this.actions$.pipe(
ofType(action1),
mapTo(action3)
)
应该具有您描述的语义