rxjs - 当我们在 Angular 7 中不使用 rxjs 时是否需要取消订阅
问题描述
我正在从 api(在服务文件中)获取数据并且我正在订阅 ts 文件。我没有使用 rxjs(可观察和订阅)。我对当我们不使用 rxjs 时是否需要取消订阅感到困惑角度 7.如果需要取消订阅,那么如果不使用 rxjs,我们该怎么做
// ts
export class ViewDataComponent implements OnInit {
regions: Region[];
dataSource: MatTableDataSource<PaginatedMapData>;
constructor(private ApiServiceObj: ApiService ) {}
ngOnInit() {
this.ApiServiceObj.getLocationData().subscribe((res) => {
this.regions = res;
console.log(res);
});
this.ApiServiceObj.getMarkerDataForTableView(this.startdate, this.enddate, this.regionOption, 0, 10)
.subscribe((res) => {
this.dataSource = new MatTableDataSource(res['results']);
});
}
}
解决方案
当你调用 unsubscribe 方法时订阅结束,但是当 observable 完成或出错时它也会自动发生:
一个符合 Observer 接口的对象,通常会交给 observable.subscribe(observer) 方法,Observable 会调用 Observer 的 next(value) 方法提供通知。一个行为良好的 Observable 将只调用一次 Observer 的 complete() 方法,或者只调用一次 Observer 的 error(err) 方法,作为最后一次传递的通知。
来源: http ://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObserverDoc.html
当您使用的这个 api 服务总是在进行常规的 http 调用时,您可以非常确定,当调用完成时,返回的那些 Observable 总是会立即进入完成或错误状态。所以实际上,在这种情况下,您可以不取消订阅而侥幸逃脱。当您真正开始使用 rxjs,并开始使用主题等时……最佳实践是使用“takeUntil”方法来确保清理所有订阅。
有关 takeUntil 方法的更多信息: https ://ncjamieson.com/avoiding-takeuntil-leaks/
简短总结:我个人喜欢使用 rxjs 和响应式编程,但我知道它并不适合所有人。Angular 在进行 http 调用时确实会强制您使用它。如果您和您的团队决定不使用 rxjs,因为它增加了复杂性,那么您可以不取消订阅从 httpclient 返回的 observables。
但是您 - 应该 - 至少了解为什么在这种情况下它是不必要的。简单地向 observable 添加一个操作符就足以引入泄漏订阅......
如果你不想相信我的话: https ://gitter.im/angular/angular?at=5681e8fa3c68940269251fa5
推荐阅读
- nginx - 构建时的 gzip 压缩或运行时使用 nginx 的 gzip 压缩?
- c# - 将 DateTimeOffset 作为路由属性传递
- spring - 使用 Spring Boot 对 MongoDB 进行类型映射
- c# - 为什么 Moq.SetupGet 抛出 NotSuportedException
- android - Delphi RIO Android 应用程序界面冻结
- r - geom_dotplot:更改形状以及如何在点图上放置一条线?
- protractor - 我们如何在量角器中单击特定文本的父元素
- regex - 如何修复这个正则表达式
- api - http.dart HttpException:在收到完整标头之前连接已关闭
- laravel - Laravel 路由组和前缀