Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 实例化服务中的RxJs主题_Angular_Rxjs - Fatal编程技术网

Angular 实例化服务中的RxJs主题

Angular 实例化服务中的RxJs主题,angular,rxjs,Angular,Rxjs,与组件相比,在服务中实例化RxJS主题是否有缺点?主体的实例化本身是否会导致内存泄漏,比如当我们忘记取消订阅可观察对象时?服务的范围(根/模块/组件)在这方面重要吗?您应该创建服务来管理逻辑,组件类应该只封送模板和服务之间的数据 管理订阅的最佳方法是使用异步管道 @Injectable() export class DataService { data$ = new BehaviorSubject<DataType>(new DataType()); } <ng-cont

与组件相比,在服务中实例化RxJS主题是否有缺点?主体的实例化本身是否会导致内存泄漏,比如当我们忘记取消订阅可观察对象时?服务的范围(根/模块/组件)在这方面重要吗?

您应该创建服务来管理逻辑,组件类应该只封送模板和服务之间的数据

管理订阅的最佳方法是使用异步管道

@Injectable()
export class DataService {
  data$ = new BehaviorSubject<DataType>(new DataType());
}
<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
</ng-container>
在模板中,使用异步管道进行订阅

@Injectable()
export class DataService {
  data$ = new BehaviorSubject<DataType>(new DataType());
}
<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
</ng-container>

{{data}json}

使用异步管道进行操作意味着订阅是为您管理的,并且没有内存泄漏。

您应该创建服务来管理逻辑,组件类应该只封送模板和服务之间的数据

管理订阅的最佳方法是使用异步管道

@Injectable()
export class DataService {
  data$ = new BehaviorSubject<DataType>(new DataType());
}
<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
</ng-container>
在模板中,使用异步管道进行订阅

@Injectable()
export class DataService {
  data$ = new BehaviorSubject<DataType>(new DataType());
}
<ng-container *ngIf="data$ | async as data">
  {{ data | json }}
</ng-container>

{{data}json}

使用异步管道进行操作意味着订阅是为您管理的,并且没有内存泄漏。

您始终必须在组件
onDestroy
上取消订阅可观察对象/主题,或者使用
async
管道来执行此任务。因此,如果主题是在服务或组件中创建的,则没有什么区别

在大多数情况下,我们在组件中注入服务以进行业务逻辑处理,所以组件是一个消费者,当它在DOM中不再可用时,它有责任停止消费以防止内存泄漏


服务的范围实际上取决于您的业务需求,即服务商店是否共享数据,或者是否需要新的服务实例。但是,取消订阅规则不会改变,您始终必须在组件
onDestroy
上取消订阅可观察对象/主题,或者使用
异步
管道来完成此工作。因此,如果主题是在服务或组件中创建的,则没有什么区别

在大多数情况下,我们在组件中注入服务以进行业务逻辑处理,所以组件是一个消费者,当它在DOM中不再可用时,它有责任停止消费以防止内存泄漏


服务的范围实际上取决于您的业务需求,即服务商店是否共享数据,或者是否需要新的服务实例。然而,退订规则并没有改变,这实际上取决于您编写的代码以及如何使用它。忘记取消订阅总是会导致不完整的可观察对象的内存泄漏。该订阅将始终保留在内存中,并为该主题发出的每个新事件触发。对,这是假设一些客户端代码订阅了该主题,并且没有取消订阅。假设该主题的所有订阅者都取消订阅,那么与组件相比,在服务中使用该主题是否有负面影响?我认为这会影响到用户的意见范围以及您对设计应用程序的偏好,这在这里有点超出范围。然而,与组件相比,在服务中有一个主题可以让您通过依赖项注入更容易地共享它。另外,在组件中包含一个主题也不能保证如果您忘记取消订阅,它将被垃圾收集。对,因此,您的答案是,就内存泄漏而言,不管主题是在服务还是组件中实例化的,只要订阅被取消,都不应该存在问题?这实际上取决于您编写的代码以及如何使用它。忘记取消订阅总是会导致不完整的可观察对象的内存泄漏。该订阅将始终保留在内存中,并为该主题发出的每个新事件触发。对,这是假设一些客户端代码订阅了该主题,并且没有取消订阅。假设该主题的所有订阅者都取消订阅,那么与组件相比,在服务中使用该主题是否有负面影响?我认为这会影响到用户的意见范围以及您对设计应用程序的偏好,这在这里有点超出范围。然而,与组件相比,在服务中有一个主题可以让您通过依赖项注入更容易地共享它。组件中包含主题也不能保证如果您忘记取消订阅,它将被垃圾收集。对,因此您的答案是,只要订阅取消,就内存泄漏而言,无论主题是在服务还是组件中实例化,都不应该有问题?谢谢,这个答案比我的问题要宽泛一些。我认为您支持在服务中实例化主题,并且没有看到内存泄漏方面的负面影响。订阅管理对于避免内存泄漏很重要,异步管道有助于避免内存泄漏,并且您需要订阅的时间使用takeUntil,直到您在Ngondestry上发送到一个主题。再次查看此感谢,我相信你是对的,我已经意识到这一点。我的问题和后续问题的重点与总体订阅管理略有不同。范围重要吗?不,在根目录、模块和组件中提供服务的区别在于实例的唯一性。根是一个单实例,模块跨模块,组件位于组件层次结构之间。无论服务实例如何共享,您都有完全相同的订阅关注点。取消订阅完成后,异步管道在这方面会有所帮助,因为它会为您管理订阅。在多大程度上,可观察到的东西是共享的,这并不会改变这一点。谢谢,这个答案比我的问题要宽泛一些。因此,我认为您支持在服务中实例化主题,并且没有看到内存泄漏的负面影响。订阅管理对于避免内存泄漏很重要,异步管道有助于解决此问题,并且可以帮助您确定订阅的时间