web-dev-qa-db-ja.com

RXJSパイプでtap()がトリガーされない

私は最初のものを好むが、同じことをする方法をしなければなりません。しかし、最初のアプローチは機能していないようです。 (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')
});
7
Florian Ludewig

最後にバルブがある実際の物理的なパイプのようなRxJSパイプを想像してください。各パイプは、パイプを流れる液体を「変更」しますが、最後のバルブが閉じている限り、何も流れません。

つまり、最後にバルブを開く必要があります。これは、監視可能なパイプに対してサブスクライブによって行われます。最も簡単な解決策は次のとおりです。

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

pipeは新しいObservableを作成するため、それを割り当ててから、そのインスタンスにサブスクライブする必要があります。あなたのケースではpipeリターンを省略しているため、余分なパイプアクションなしで、変更されていない単純な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')
});
3
Antoniossss