我正在阅读RxJS文档,并希望确保我理解Subscriber.unsubscribe()
和Subscriber.complete()
之间的区别。
假设我有两个订阅者,即subscriber1和subscriber2的观察者。如果subscriber1呼叫取消订阅他们的订阅,它将不再接收来自observable的通知,但subscriber2将继续接收它们。
.complete()
的文档:
Observer回调,用于从Observable接收类型为complete的无值通知。通知Observer Observable已完成发送基于推送的通知。
这是否意味着在上面的相同场景中,subscriber1可以调用complete并且它将结束observable并停止subscriber1和subscriber2的流?
答案 0 :(得分:4)
订阅者不要致电complete()
。您可以在主题上拨打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
请注意,在主题上调用complete()
会更改其内部状态,并且在取消订阅订阅者对主题没有影响时,无法再次使其无法完成。
一个类似的问题:Observable Finally on Subscribe
答案 1 :(得分:3)
根据我对API的体验,我们的想法是:您不会拨打Observable
,Observable
会给您打电话。如果您创建Subject
和next
/ complete
主题,则可以触发事项。
这就是为什么你会看到一些拥有"私有" Subject
作为类成员,但公开公开的项目是Observable
。我们期望您订阅Observable
,而顶级课程将通过Subject
和next()
以及error()
发送值。完成Observable / Subject的唯一方法是complete()
Subject
。
此外,Subscrib er 没有unsubscribe()
方法,订阅 也有。