RxJS订阅者取消订阅与完成

Bre*_*han 9 javascript rxjs

我是通过RxJS文档阅读,并希望确保我理解之间的差异Subscriber.unsubscribe()Subscriber.complete().

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

文档.complete():

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

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

mar*_*tin 7

订户不打电话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
Run Code Online (Sandbox Code Playgroud)

请注意,调用complete()主题会更改其内部状态,并且无法使它再次变得不完整,而仅取消订阅者对主题没有影响。

一个类似的问题:最终在订阅上可以观察到


zer*_*298 5

根据我在API方面的经验,想法是:您不调用Observable,而是Observable调用您。如果创建Subject和和next/ complete主题,则可以触发事件。

因此,您会看到一些示例,这些示例具有“ private” Subject作为班级成员,但公开显示的项目是Observable。期望您将预订,Observable顶级类将通过Subjectwith next()和调度值error()。完成可观测/问题的唯一方法是complete()Subject

此外,Subscrib 没有一个unsubscribe()方法,一个Subscrip 重刑呢。