web-dev-qa-db-ja.com

パイプアンドタップVSサブスクライブngxs

パイプとサブスクライブで遊んでいます。タップでパイプを使用している場合、コンソールに何もログインしません。サブスクライブを使用している場合、機能しています。だから私が間違っているのは何ですか?

import { Observable } from 'rxjs';
import { tap, take } from 'rxjs/operators';

this.store.select(state => state.auth.authUser).pipe(
  take(1),
  tap((data) => {
    //Not Working - no console output
    console.log('[Tap] User Data', data);

  })
);

this.store.select(state => state.auth.authUser).subscribe((data) => {
  // Working - user data output in console
  console.log('[Subscribe] User Data', data);
})

RxJs 6、TypeScript、ngxsをAngular 6。

7
Paul

私の答えは2つの部分に分かれています...あなたが尋ねたもの、そしてあなたが必要なもの????。 Observableの値は、アクティブなサブスクリプションがある場合にのみパイプオペレーターを流れます。それが、あなたがこの振る舞いを見ている理由です。したがって、次のようなことを行う必要があります。

this.store.select(state => state.auth.authUser).pipe(
  take(1),
  tap((data) => {
    console.log('[Tap] User Data', data)
  })
).subscribe();

しかし、あなたが探しているように見えるのは、状態のスナップショットです。これは次のようにして実行できます。

let data = this.store.selectSnapshot(state => state.auth.authUser);
console.log('[selectSnapshot] User Data', data);
13
Mark Whitfeld

とった! subscribe()を追加する必要があります。だから:

this.store.select(state => state.auth.authUser).pipe(
  take(1),
  tap((data) => {
    console.log('[Tap] User Data', data)
  })
).subscribe();
2
Paul

"tap"(またはRxJSの古いバージョンでは "do")-> ロギングなどのアクションまたは副作用を透過的に実行(定義どおり)。しかし、あなたの場合、Observableに「subscribe()」するのを忘れていたため、コンソールに「User Data」が表示されません。

一方、2番目のケースでは、すでにObservableにサブスクライブしています。

1
Dionis Oros