【问题标题】:tap() isn't triggered in RXJS PipeRXJS 管道中未触发 tap()
【发布时间】:2019-02-10 19:34:22
【问题描述】:

虽然我更喜欢第一种方式,但我必须采取不同的方式来做同样的事情。但是第一种方法似乎不起作用。 (tap() 没有被触发)

// does not work
this.actions$.pipe(
    ofType(LayoutActions.Types.CHANGE_THEME),
    takeUntil(this.destroyed$),
    tap(() => {
        console.log('test')
    }),
);
// works
this.actions$.ofType(LayoutActions.Types.CHANGE_THEME).subscribe(() => {
    console.log('test')
});

【问题讨论】:

    标签: angular rxjs reactive-programming ngrx


    【解决方案1】:

    pipe 创建新的Observable 因此您必须分配它然后订阅该实例。在您的情况下,您将省略 pipe return 因此您最终会得到简单的、未修改的 Observable ,而无需任何额外的管道操作。

    还请记住,您很可能必须订阅pipe(和tap)才能工作。

    试试

    this.actions$=this.actions$.pipe(
        tap(()=>console.log("First tap")),
        ofType(LayoutActions.Types.CHANGE_THEME),
        takeUntil(this.destroyed$),
        tap(() => {
            console.log('Last tap')
        }),
    );
    
    this.actions$.subscribe(() => {
        console.log('subscribtion')
    });
    

    【讨论】:

      【解决方案2】:

      将 RxJS 管道想象成末端带有阀门的实际物理管道。每条管道都会“改变”流经它的液体,但只要末端的阀门关闭,就不会有任何东西流动。

      所以,你需要的是在最后打开阀门。这是通过订阅 到可观察管道来完成的。最简单的解决方案是:

      this.actions$.pipe(
          ofType(LayoutActions.Types.CHANGE_THEME),
          takeUntil(this.destroyed$),
          tap(() => {
              console.log('test')
          }),
      ).subscribe(_ => console.log("water is flowing!"));
      

      【讨论】:

      • 以前从未使用过管道,并且遇到与 OP 相同的问题。非常感谢,现在水流了!!!哈哈
      • 太棒了!谢谢
      • 可怕的答案。是的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多