【问题标题】:RxJS: Subject does not work after subscribed Observable has endedRxJS:订阅的 Observable 结束后主题不起作用
【发布时间】:2020-09-28 13:29:42
【问题描述】:

考虑以下代码 (on Stackblitz):

const subject$ = new BehaviorSubject<number>(0);

const second$ = of<number>(3, 4, 5)
  .pipe(delay(100));

subject$.subscribe(console.log);

subject$.next(1);
subject$.next(2);

const subscription$ = second$.subscribe(subject$);

setTimeout(() => subscription$.unsubscribe(), 200);

setTimeout(() => subject$.next(6), 300);

我想要一个 Subject,它“手动”(使用 next)接收数据,然后只要它存在,就订阅另一个 observable,然后可以正常使用。

上面的代码放出来

0
1
2
3
4
5

6 丢失了,显然是因为它是在同时订阅的 observable 完成后设置的。如果我不取消订阅第二个 observable,也会发生同样的情况。

订阅的 Observable 结束后,Subject 怎么可能不结束?

【问题讨论】:

  • 你到底想达到什么目的?

标签: typescript rxjs


【解决方案1】:

这一行:const subscription$ = second$.subscribe(subject$); 导致您的主题完成。

您将 Subject 传递给 subscribe 方法的方式,它将在 Observable 发出时执行 subject$.next,并在 Observable 完成时执行 subject$.complete。您的 Observable 在发出 3 个项目后完成,因此 Subject 也完成了。当 Subject 完成时,您不能使用它来发出新项目,这导致我们认为您不应该完成 Subject。

为了实现这一点,请使用以下内容:

const subscription$ = second$.subscribe((item) => subject$.next(item));

这样,当second$ 完成时,您的主题将不会完成。

【讨论】:

  • 好的,这非常简单。我想到了一个特定的管道或类似的方向,但这很容易。
猜你喜欢
  • 2020-12-13
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2017-11-05
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多