Javascript 如何将get.pipe takeUntil和subscribe与RxJX组合成一个函数?

Javascript 如何将get.pipe takeUntil和subscribe与RxJX组合成一个函数?,javascript,angular,rxjs,frontend,Javascript,Angular,Rxjs,Frontend,在Angular中,每次需要查询端点时,都需要调用以下代码: this.service.getSomeData() .pipe(takeUntil(this.onDestroy$)) .subscribe((message: any) => { some code here; } TakeTill是组件中的一个函数,用于在组件被销毁时取消订阅 如何重构上面的代码,这样就不必在每次使用资源时都键入所有这些内容了?所以最后看起来差不多是这样的 this.service.ge

在Angular中,每次需要查询端点时,都需要调用以下代码:

this.service.getSomeData()
 .pipe(takeUntil(this.onDestroy$))
 .subscribe((message: any) => { 
    some code here; 
 }
TakeTill是组件中的一个函数,用于在组件被销毁时取消订阅

如何重构上面的代码,这样就不必在每次使用资源时都键入所有这些内容了?所以最后看起来差不多是这样的

this.service.getSomeData(
   (message: any) => {
     some code here;
   }
)

一个选项是使用模板中的异步管道来管理订阅

data$ = this.service.getSomeData();
在你的模板中

<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
  You can use the template variable data here that magically updates every time data$
  emits and no need to unsubscribe as the async pipe manages the subscription for you
</ng-container>

您可以在此处了解我在状态管理库中使用的模式

一个选项是使用模板中的异步管道来管理订阅

data$ = this.service.getSomeData();
在你的模板中

<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
  You can use the template variable data here that magically updates every time data$
  emits and no need to unsubscribe as the async pipe manages the subscription for you
</ng-container>
您可以在这里阅读我在州管理库中使用的模式

我很高兴您这么问, 我遇到了这个,我引用了这个,因为我发现实现这个的逻辑非常漂亮

它相对容易使用,并且可以跨所有的DeclarableSpipe、指令和组件工作

现在省略我不建议的订阅和取消订阅部分,它非常简单,而且很直接

早些时候你有过类似的经历

getSomeData:可观察的{ //例如 返回this.http.get; } 您必须将其更改为:

getSomeDatacallback,onDestroy$:可观察{ this.http.get….pipetakeUntilonDestroy$.subscribebeval=>callbackval; } 然后我们就能得到我们最终想要的。 干杯。

我很高兴你这么问, 我遇到了这个,我引用了这个,因为我发现实现这个的逻辑非常漂亮

它相对容易使用,并且可以跨所有的DeclarableSpipe、指令和组件工作

现在省略我不建议的订阅和取消订阅部分,它非常简单,而且很直接

早些时候你有过类似的经历

getSomeData:可观察的{ //例如 返回this.http.get; } 您必须将其更改为:

getSomeDatacallback,onDestroy$:可观察{ this.http.get….pipetakeUntilonDestroy$.subscribebeval=>callbackval; } 然后我们就能得到我们最终想要的。
干杯。

通常,在从视图/dom卸载某些组件后,您的服务不必被销毁/禁用。将它们视为执行某些数据转换或获取的代码层

问:为什么每个人都使用takeUntilthis.Discreated$或this.subscription.Unsubscripte

答:只要至少有一个订户,可观测的生命就存在。因此,如果您有一些长期存在的观测值,而这些观测值在某个操作之后并没有立即完成,那么您将有内存泄漏,您可以多次创建/初始化每个组件。说到Angular的http,所有get、post、put和delete调用都是在后端调用完成后完成的。这意味着您不必在OnDestroyHook中添加unsubscribe或使用takeUntil

如果您已建立Websocket连接并正在侦听某些消息,则流将变得持久,订阅此消息的每个组件都应在onDestroy循环期间取消订阅。如果您不这样做,Angular可以多次初始化您的组件,这通常发生在*ngIf=语句中,并且创建了多个订阅,但从未销毁。这会导致内存泄漏


不幸的是,对于大多数Angular项目来说,这是一个常见问题,可以通过手动取消订阅/takeUntil或使用异步管道来解决。异步管道在组件销毁后自动执行取消订阅。

通常,在从视图/dom卸载某些组件后,不必销毁/禁用服务。将它们视为执行某些数据转换或获取的代码层

问:为什么每个人都使用takeUntilthis.Discreated$或this.subscription.Unsubscripte

答:只要至少有一个订户,可观测的生命就存在。因此,如果您有一些长期存在的观测值,而这些观测值在某个操作之后并没有立即完成,那么您将有内存泄漏,您可以多次创建/初始化每个组件。说到Angular的http,所有get、post、put和delete调用都是在后端调用完成后完成的。这意味着您不必在OnDestroyHook中添加unsubscribe或使用takeUntil

如果您已建立Websocket连接并正在侦听某些消息,则流将变得持久,订阅此消息的每个组件都应在onDestroy循环期间取消订阅。如果您不这样做,Angular可以多次初始化您的组件,这通常发生在*ngIf=语句中,并且创建了多个订阅,但从未销毁。这会导致内存泄漏

不幸的是,对于大多数角度项目来说,这是一个常见的问题,可以通过手动取消订阅/takeUntil或使用异步pi来解决 在组件销毁后自动执行取消订阅的pe