gpt4 book ai didi

angular - 在 angular2 中,是否有可能获得可观察对象的订阅者数量?

转载 作者:太空狗 更新时间:2023-10-29 17:09:40 25 4
gpt4 key购买 nike

我想有可能继续订阅一个可观察对象而忘记取消订阅。我怀疑这发生在我的应用程序中。 observable 是否有一个属性可以让我计算挂断它的订阅者数量?

最佳答案

虽然完全有可能忘记取消订阅,并且泄漏的后果从永无止境的测试运行器到内存泄漏,但 angular2 有一些工具和通用模式来管理其生命周期。

angular2 提供了一种不会忘记的简单方法。在模板中使用时,最简单的方法是简单地使用 async 管道,它将自动为您订阅和取消订阅。

否则,当您使用 .subscribe() 方法时,它会返回一个订阅。一种常见的做法是在构造函数中捕获注入(inject)的依赖项,在 ngOnInit 中对组件进行必要的订阅,并在 ngOnDestroy 中取消订阅。

有时,您会订阅多个可观察对象。 RxJS 提供类 Rx.Subscription 来将订阅分组在一起。它可以通过以下方式使用:

const incomeSubscription = income$.subscribe(x => console.log(x));
const expensesSubscription = expenses$.subscribe(x => console.log(x));

const subscription = new Rx.Subscription();
subscription.add(incomeSubscription);
subscription.add(expensesSubscription);

现在调用 subscription.unsubscribe() 将取消订阅任何仍然有效的订阅。

最后,重要的是要了解 RxJS 流默认是单播的(不像 promises 总是缓存结果并且只是多播)。这实际上意味着每个订阅实际上都变成了一个新的 rx 流。例如,对于像 Http.get() 这样的“冷”可观察对象,每个订阅实际上都会从头开始生成数据。因此,在上述使用 Http.get() 的情况下,您将为每个订阅(或在模板中使用管道异步的实例)进行 HTTP 调用。

这意味着最好的做法是:

  • 只在容器风格的组件中使用异步管道,并且有 dumb对 RxJS 一无所知的展示组件。这有助于仅在容器级别订阅

  • 如果在订阅者之间共享数据以使用像 .refCount() 这样的运算符在某些情况下或其他情况下的主题。这使得流多播和订阅者共享同一个流,而不是每个人都有自己的流

  • 对于 angular v4+,使用 | 已成为一种很好的做法async 结合 as secondaryName (stream$ | async as streamData) 所以在容器组件中,如果你多次使用一个 observable 的值,你不会多次订阅到可观察的

关于angular - 在 angular2 中,是否有可能获得可观察对象的订阅者数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38627242/

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