当前位置: 首页 > 知识库问答 >
问题:

我是否需要退订Angular的可观测数据?[重复]

杨豪
2023-03-14

令人惊讶的是,很难得到一个关于你是否应该以及何时取消订阅角度观测的直接答案。

我有以下情况:

this.subscription = this.service.makeHTTPCall(stuff).subscribe(x => {
//do something
});

我看到了一些解决方案:

>

this.service.makeHTTPCall(stuff).subscribe(x => {
//do something
});

将订阅存储为变量,并在Ngondestory中取消订阅

ngOnDestroy() {
if (this.subscription) { this.subscription.unsubscribe(); }
}

什么都不做,我会帮你把所有的退订资料整理出来

我知道有第三方库,比如ng-tak-to-销毁,但是假设我们没有任何第三方库,这是建议的退订方法?

共有3个答案

仰成天
2023-03-14

对于一些冷观测,您不需要手动取消订阅,因为它们将发出一次,然后立即完成。http服务就是这样一个可观察的示例

也就是说,如果你不知道一个可观测物体是否会发射一次并立即完成,那么你应该总是做适当的清理。

就我个人而言,我更喜欢使用ake(1)运算符,它将获取第一个响应,然后取消订阅本身:

someObs.pipe(take(1)).subscribe(...)
壤驷阳波
2023-03-14

您不需要手动取消订阅HTTP Observable和Router Observable。对于所有其他订阅服务器,最佳做法是创建主题destroy$,然后使用rxjs管道takeUntil()获取所有订阅服务器,直到destroy$处于活动状态。在Ngondestory中,您在destroy$主题中发出true并取消订阅。所有其他订户将一起停止。不要为你整理所有的退订资料,你应该自己做。它可以提供许多可调试的错误,以便在组件销毁后离开gost订户。下面是示例代码:

onDestroy$: Subject<boolean> = new Subject();

ngOnInit() {
 this.service.someSubscriber.pipe(takeUntil(this.destroy$)).subscribe(() => 
{ //do stuff 
})
this.service.someSubscriber2.pipe(takeUntil(this.destroy$)).subscribe(() => 
{ //do stuff 
})
this.service.someSubscriber3.pipe(takeUntil(this.destroy$)).subscribe(() => 
{ //do stuff 
})
}

ngOnDestroy() {
  this.destroy$.next(true);
  this.destroy$.unsubscribe();
}

在html模板中,异步管道会自动触发取消订阅,所以当您使用它时,您不必担心它。

史弘致
2023-03-14

您不需要手动取消订阅HTTP Observable和Router Observable。除这两种方法外,您创建的任何主题或可观察对象都可以使用前面提到的一种方法手动取消订阅,另一种方法可以使用async操作符。。async操作符会自动为您取消订阅,这也是您可以使用takeUntil操作符的另一种方式

从https://stackoverflow.com/a/41177163/2987066

TLDR:

对于这个问题,有(2)种可观测值——有限值和无限值。

超文本传输协议可观测数据产生有限(1)值,类似DOM事件侦听器的东西可观测数据产生无限值。

如果您手动调用订阅(不使用异步管道),则从无限的可观察对象中取消订阅。

不要担心有限的,RxJs会照顾他们。

 类似资料:
  • 我的根(引导)Angular(6.x)组件中有一个可观察到的组件。 通常,在使用生命周期钩子调用destroy()时,我会取消订阅任何打开的订阅。 由于AppComponent是应用程序的根,因此从不被销毁(除非整个应用程序被销毁),我是否还需要实现ngOnDestroy以及是否需要费心取消订阅? 我一直没能找到这个看似常见的确切情况的答案。 示例: 谢谢!

  • 让我们考虑下面的示例代码: 在函数gude()中,将创建一个新的observable,它将发出哈希值,该哈希值的前n个前导值设置为零。一个观察者订阅了那个可观察的,并立即取消订阅。让我们假设函数createHashWithNLeadingZeroes()需要相当长的时间来生成响应。 我想这里发生了以下事情: (1) 创建了一个新的可观察对象,描述可观察对象行为的函数被内部存储在属性_subscri

  • 我正在创建一个应用程序,希望用户打开他们的活动聊天。它由Firebase作为后端提供动力。但是,在从第一个可观察订阅中检索数据(我需要将其用作第二个可观察订阅中的参数)之后,第二个订阅不会返回任何数据:它是空的。 在第一个订阅中,我检索一个唯一的ChatID。对于第二次订阅,我希望使用此ChatID接收Firebase集合中的所有邮件。 我已经发现它与观测对象的异步风格有关,但是我不知道如何嵌套观

  • 我必须从两个订阅服务器获取数据,但我总是获取第一个订阅服务器的数据。 我有一个数据共享服务: 在离开搜索组件之前,我调用update方法。 现在,我在results组件上。我得到的共享数据如下: 我的问题是:我需要共享数据来订阅另一个可观察的数据。首先,我构造了一个物体乘坐,在我调用搜索方法之后 问题是我总是从数据服务获取数据,而不是从api调用。api工作导致我在存储中拦截结果,而不是在组件中。

  • 我有个简单问题。我是否需要手动退订或者angular正在为我做这件事,或者如果不知道发生了什么? 多谢了。

  • 问题内容: 我有一个非常简单的文件: 而且有效。 但是,当我删除元素时,应用程序看不到实体(所有类都带有注释)。 是否有自动扫描类的机制? 问题答案: 你可以使用 该文件定义了一个名为的持久性单元,它使用JTA感知数据源。所述和元素指定管持久类:实体类,可嵌入类和超类映射。该元素指定JAR文件都包含持久化类管理的打包持久单元可见,而该class元素明确命名持久化类管理。 对于,也可以进行设置和配置