RxJS订阅者取消订阅与完成

时间:2018-02-13 16:29:34

标签: javascript rxjs

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

假设我有两个订阅者,即subscriber1和subscriber2的观察者。如果subscriber1呼叫取消订阅他们的订阅,它将不再接收来自observable的通知,但subscriber2将继续接收它们。

.complete()的文档:

  

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

这是否意味着在上面的相同场景中,subscriber1可以调用complete并且它将结束observable并停止subscriber1和subscriber2的流?

2 个答案:

答案 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的体验,我们的想法是:您不会拨打ObservableObservable会给您打电话。如果您创建Subjectnext / complete主题,则可以触发事项。

这就是为什么你会看到一些拥有"私有" Subject作为类成员,但公开公开的项目是Observable。我们期望您订阅Observable,而顶级课程将通过Subjectnext()以及error()发送值。完成Observable / Subject的唯一方法是complete() Subject

此外,Subscrib er 没有unsubscribe()方法,订阅 也有。