【问题标题】:Is it needed to unsubscribe when we don't use rxjs in angular 7当我们在 Angular 7 中不使用 rxjs 时是否需要取消订阅
【发布时间】:2019-08-06 12:59:00
【问题描述】:

我正在从 api(在服务文件中)获取数据,并且正在订阅 ts 文件。我没有使用 rxjs(可观察和订阅)。我对是否需要取消订阅感到困惑在 Angular 7 中使用 rxjs。如果需要取消订阅,那么如果不使用 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']);


      });
    }
}

【问题讨论】:

  • 但是你正在使用 rxjs。
  • 是的,您应该退订
  • 当前的“最佳做法”是始终取消订阅。正如下面的答案所述,它并不总是必需,但最好总是拥有它。

标签: rxjs angular7


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-07-09
    • 2017-11-28
    • 2017-05-12
    • 1970-01-01
    • 2023-04-09
    • 2019-01-31
    • 2018-09-15
    • 2021-03-03
    • 2018-11-10
    相关资源
    最近更新 更多