RxJS订阅者unsubscribe和complete的区别

20

我正在阅读RxJS文档,想确保我理解Subscriber.unsubscribe()Subscriber.complete()之间的区别。

假设我有一个带有两个订阅者subscriber1和subscriber2的可观测对象。如果subscriber1在其订阅上调用unsubscribe,它将不再从可观测对象接收通知,但subscriber2将继续接收通知。

.complete()的文档:

Observer回调函数,用于从Observable接收值为空的完整类型通知。通知Observer Observable已完成发送基于推送的通知。

这是否意味着在上述相同的情况下,subscriber1可以调用complete并结束可观测对象,并停止subscriber1和subscriber2的流?


2
您似乎混淆了订阅者和订阅API,请澄清一下。 - jonrsharpe
是的,你说得对,现在我再次查看文档后明白了。我认为这就是让我对Subscriber感到困惑的原因:“观察者被转换为订阅者,以提供类似于取消订阅的Subscription功能。”但从Observable.subscribe返回的是Subscription而不是Subscriber。 - BrentShanahan
2个回答

18

订阅者不会调用complete()。你可以在Subject上调用complete(),或者更常见的是使用像take()takeWhile()这样的运算符“间接”调用它。

例如:

const s = new Subject();
const subscriber1 = s.subscribe(...);
const subscriber2 = s.subscribe(...);
s.complete(); // both subscribers will receive the complete notification

// or with `take(1)` operator it'll call `complete()` for you
const subscriber1 = s.take(1).subscribe(...);
const subscriber2 = s.take(1).subscribe(...);
s.next(42); // both subscribers will receive the complete notification

请注意,在 Subject 上调用 complete() 会更改其内部状态,而仅取消订阅订阅者则对 Subject 没有影响。

类似的问题:Observable Finally on Subscribe


1
主题提供了取消订阅和完成两种方法,因此在我的代码中看起来像是我正在查看并且根据文档假定它是一个订阅者,糟糕。深入挖掘 RxJS 代码后发现,Subject.complete() 将调用其观察者的 complete 方法,而取消订阅仅通过将观察者设置为 null 来从主题中删除所有观察者。有趣,谢谢。 - BrentShanahan

9
从我的API使用经验来看, 其思路是这样的:你不调用 Observable,而是 Observable 调用你。但如果你创建了一个 Subject,你可以通过 next()complete() 触发一些操作。
这就是为什么有些例子会把"private" 的 Subject 作为类成员,但公开暴露的却是一个 Observable。预期的方式是你会订阅这个 Observable,而顶层类将通过 Subject 以及 next()error() 分配值。完成 Observable/Subject 的唯一方法是通过 complete() 去完成 Subject
此外,Subscriber 没有 unsubscribe() 方法,而 Subscription 有。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接