【问题标题】:BehaviorSubject used as PartialObserver breaks the subscription on BehaviorSubject用作 PartialObserver 的 BehaviorSubject 中断了对 BehaviorSubject 的订阅
【发布时间】:2019-08-14 17:04:50
【问题描述】:

我查看了 observables 的接口,发现您可以将任何实现 PartialObserver 的东西传递给 subscribe 函数。所以我用 BehaviorSubject 做到了。

像这样 (A)

source$
      .pipe(
        tap(() => console.log('X')),
      )
      .subscribe(this._titlesX$);

所以我做了,但发现了一些非常奇怪的东西。如果我将行为主题传递给订阅函数,则会发出值,但要看到这一点,您必须在将 BehaviorSubject 用作​​ PartialObserver 之前进行订阅。

在 BehaviorSubject 的文档中,您可以找到:

A variant of Subject that requires an initial value and emits its current value whenever it is subscribed to.

所以当使用 BehaviorSubject 作为 partialObserver 时,这种行为会中断。(没有双关语)

但是当我使用这种方法时: 像这样(B)

source$
     .pipe(
        tap(() => console.log('X')),
      )
      .subscribe(res => this._titlesX$(res));

一切都按预期进行。

为什么方法 A 不起作用?这是一个错误还是我只是用错了?

这里是 stackblitz all setup 的链接。 Link to stackblitz project

titleX:代表方法A titleY:代表方法B

应该可以使用 BehaviorSubject 订阅。您订阅的时间并不重要。否则它不应该被允许作为订阅方法的参数。

【问题讨论】:

  • 虽然我承认这是来自 Observable 的相当奇怪的行为,它应该在订阅时重新发出其最新的发射,但我真的不明白你为什么要将 BehaviorSubject 传递给 subscribe 函数。您只是在尝试还是有什么具体的想法?
  • @WillAlexander 我一直这样做。想要缓存结果很方便。
  • 出于好奇,有什么理由将其放入subscribe 而不是tap 或自定义运算符中?
  • rxjs 有很多多播操作符。将其放入 subscribe 是最直接的方法,但如果您想将一个主题完全连接到另一个主题,因为它会自动传递 onNext、onError 和 onComplete
  • @WillAlexander 我有一个 httpClient 响应。我映射了一些东西。并将结果传递给 BehaviorSubject。所以我们可以访问关于 2q 的下一个等:我不希望我的 observables 有副作用。

标签: angular rxjs observable reactive-programming


【解决方案1】:

原因是因为当你这样做时

source$.subscribe(this._titlesX$)

您已将源完全转换为 BehaviorSubject,因为 BehaviorSubject 是一个完整的观察者,包括完整和错误处理程序。 of 在一次发射后完成,因此它也完成了您的 BehaviorSubject,并且完成的主题不会发射。但是仅仅在 source$ 的订阅中调用 next 显然不会通过完整的 / 错误处理程序。

如果您的来源更像:

const source$ = interval(1000).pipe(map(v => [v.toString()]));

在未完成的地方,您会看到预期的行为。

闪电战:https://stackblitz.com/edit/angular-gfmdgf?file=src/app/app.component.ts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多