gpt4 book ai didi

angular - 取消订阅 ReplaySubject 返回 asObservable();

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:15 27 4
gpt4 key购买 nike

标题

如果您基本上有相同的问题并且您的上下文是 Angular,您可能需要阅读答案中的所有评论以获得更多上下文。

这个问题的简短版本

在做 let observe$ = someReplaySubject.asObservable() 时, 我们是否不再需要取消订阅 observe$ ?换句话说我们可以调用let observe$ = someReplaySubject.asObservable()吗?来自多个 Angular 组件实例,而不用担心来自 notify 的连接实例到对应的Observable

假设

如果我们有一个 ReplaySubject<Todo[]>实例(我们称之为 rxTodo,我们通过以下方式从 Angular 组件订阅它:

let todoObs$:Observable<Todo[]> = rxTodo$.asObservable()那么即使组件被破坏了todoObs$在每个组件中创建的引用将悬空,直到组件本身被销毁。

背景

我正在尝试 Store Angular 的 API 和我有一个重播主题,可以广播对商店切片的更改。这是允许订阅发生的方法(notifyCount 跟踪订阅,因此如果没有订阅,我们就不会为通知而烦恼):

  /**
* Subscribe to receive slice updates.
* @example
<pre>
let todos$ = slice.subscribe();
</pre>
*/
public subscribe(): Observable<E[]> {
this.notifyCount++;
return this.notify.asObservable();
}

以上我试图遵循推荐的最佳实践返回 Observable而不是来自 ReplaySubject .

这是对应的unsubscribe方法:

  /**
* Unsubscribe from slice updates.
*
* @example
<pre>
slice.unsubscribe(o);
</pre>
*/
public unsubscribe(o: ReplaySubject<E[]>) {
o.unsubscribe();
this.notifyCount--;
}

我必须制作 o参数 a ReplaySubject输入顺序 unsubscribe .然而,这与 Observable 冲突输入 subscribe方法返回。

当尝试这样测试时:

incompleteSlice.unsubscribe(incomplete$);

返回的信息是这样的:

[ts] Argument of type 'Observable' is not assignable to parameter of type 'ReplaySubject'. Property 'scheduler' is missing in type 'Observable'. let incomplete$: Observable

关于如何解决这个问题有什么想法吗?

更新

刚刚浮现在脑海中的一个明显想法是,也许返回 asObservable意味着我们实际上不再需要 unsubscribe从那个可观察的。如果 Angular 组件被销毁,我们可以让它悬空吗?

最佳答案

我认为您对取消订阅 SubscriptionSubject 感到困惑。

Angular 中实际推荐的是在组件被销毁时取消订阅任何打开的 Subscription订阅Observable.subscribe返回。当它取消订阅时,它不再从源可观察对象接收值,这在大多数情况下是您想要的。

取消订阅 Subject 有不同的效果。它将 Subject 切换到 closed 状态,您无法再调用 next 或订阅它。你可以look directly at the source code了解发生了什么。

取消订阅 Observable 是不可能的,这就是您收到错误的部分原因。

为了遵循建议,您应该制作所有订阅的列表,即将每个订阅添加到您以后可以访问的列表中,如下所示:

this.subscriptions$.push(obs$.subscribe...))

然后在组件销毁时,调用:

this.subscriptions$.forEach(sub -> sub.unsubscribe());

但更好的是recommended by Core Developer Ben Lesh in this article不是强制调用 unsubscribe,而是使用 takeUntil 运算符。

There is a reference implementation on StackOverflow将此模式与 Angular 一起使用,您可以将其用作起点。

关于angular - 取消订阅 ReplaySubject 返回 asObservable();,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52153105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com