Pipe и Tap VS подписываются на ngxs - PullRequest
0 голосов
/ 18 мая 2018

Я играюсь с пайпом и подписываюсь.Если я использую трубу с краном, в консоль ничего не войдет.Если я использую подписку, это работает.Так что я делаю не так?

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.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Мой ответ состоит из двух частей ... Что вы спросили и что вам нужно ?.Значения 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);
0 голосов
/ 19 сентября 2018

«tap» (или «do» в старой версии RxJS) -> Прозрачное выполнение действий или побочных эффектов, таких как ведение журнала (как уже сказано в определении).Но в вашем случае вы забыли «подписаться ()» на ваш Observable, и поэтому вы не видите свои «Данные пользователя» в консоли.

С другой стороны, во втором случае,Вы уже подписаны на Observable.

0 голосов
/ 18 мая 2018

Понял!Я должен добавить подписку ().Так оно и есть:

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