14

我正在玩管道并订阅。如果我使用带有水龙头的管道,则不会登录控制台。如果我使用订阅,它正在工作。那么我做错了什么?

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);
})

我在 Angular 6 中使用 RxJs 6、TypeScript 和 ngxs 作为存储。

4

3 回答 3

18

我的回答分为两部分......你问什么,你需要什么。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);
于 2018-05-18T17:44:37.933 回答
5

知道了!我必须附加订阅()。所以它是:

this.store.select(state => state.auth.authUser).pipe(
  take(1),
  tap((data) => {
    console.log('[Tap] User Data', data)
  })
).subscribe();
于 2018-05-18T16:57:28.957 回答
5

点击(或旧版本的 RxJS 中执行)->透明地执行操作或副作用,例如日志记录(正如定义已经说明的那样)。

但是,在您的情况下,您忘记“订阅()”到您的 Observable,这就是为什么您在控制台中看不到您的“用户数据”。

另一方面,在第二种情况下,您已经订阅了一个 Observable。

于 2018-09-19T11:56:07.413 回答