首页 > 解决方案 > 当我们在 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']);


      });
    }
}

标签: rxjsangular7

解决方案


当你调用 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


推荐阅读