Rxjs NGRX效应和作用顺序

Rxjs NGRX效应和作用顺序,rxjs,ngrx,Rxjs,Ngrx,我的目标是有效地处理两个并行操作 action1只生成一次。action2生成了几次,但我只需要生成action1时的最后一个值。 如果action2先生成action1,然后再生成action1,我所面临的问题将如预期的那样出现在控制台“action3”中。但是,如果先生成action1,然后生成action2,我们将不会在控制台中看到“action3” testEffect$ = createEffect( () => this.actions$.pipe(

我的目标是有效地处理两个并行操作

action1只生成一次。action2生成了几次,但我只需要生成action1时的最后一个值。 如果action2先生成action1,然后再生成action1,我所面临的问题将如预期的那样出现在控制台“action3”中。但是,如果先生成action1,然后生成action2,我们将不会在控制台中看到“action3”

  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)
)
应该具有您描述的语义