Angular:每次需要更新时,我都应该订阅()到http.get()吗?

克里斯

我想知道我是否多次使用Observable.subscribe()。

在我的组件类中,我有一个函数loadData()。它调用另一个函数this.service.getData(),该函数使用HttpClient.get()对服务器执行HTTP请求。

当前,在我的函数loadData()中,我订阅了this.service.getData()的结果。

每次用户单击“更新”按钮时,我都想调用我的函数loadData()。

问题

  • 如果我每次需要执行HTTP请求时都调用函数loadData(),是否会创建尽可能多的订阅者?
  • 有内存泄漏的风险吗?
  • 如果是这样,您知道我应该如何重构代码?

答案

代码样本

private loadData() {
    this.loading = true;
     const subscription = this.service.getData()
      .pipe(
  // console.log() with a delay added for test - START
  map(val => {
    window.setTimeout(() => {
      // This will print true.
      console.log('After delay: Is Subscriber closed?', subscription.closed);
    }, 10);
    return val;
  }),
    // console.log() with a delay added for test - END
    takeUntil(this.ngUnsubscribe))
      .subscribe(data => {
        this.data = data;
        // This will print false.
        console.log('Is Subscriber closed?', subscription.closed);
      },
      error => {
        console.error(error);
        throw error;
      },
      () => {
        this.loading = false;
      });
}
getData(): Observable<DataObject> {
    const uri = encodeURI(this.configService.getUri());
    const headers = new HttpHeaders();
    if (this.pipelineEtag) {
      headers.set('If-None-Match', this.pipelineEtag);
    }
    return this.http.get(uri, {
      headers: headers,
      observe: 'response'
    }).pipe(
      map(resp => this.processResponse(resp)),
      catchError(error => this.handleError(error, this.envProduction))
    );
}
阿尔及利亚数据库

每次HTTP调用返回值时,Observable都会完成。因此在服务中执行这样的操作是安全的

loadData() { 

    return this.http.get<Data>(dataUrl).pipe(
      //  tap(data => console.log(data)), // eyeball results in the console
      catchError(err => this.handleError(err))
    );

}

然后打电话

this.service.loadData().subscribe((data:Data) => do somthing)

您甚至可以调用exhaustMap或switchMap来控制Observable流,以免“提示”服务器太多时间

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每个REST端点在Java EE中都应该是异步的吗?

每个优秀的Java / Java EE开发人员都应该回答的问题吗?

所有这些默认线程都应该在运行吗?并且它们可以使我的JVM保持活动状态吗?

在Android上使用MVVM时,每个活动都应该具有一个(只有一个)ViewModel吗?

使用异步/等待进行设计-一切都应该异步吗?

每个表都应该有一个主键吗?

我需要HTTP GET请求的内容类型标头吗?

每个优秀的.NET开发人员都应该回答的问题吗?

所有课程都应该可以测试吗?

每次重新启动应用程序时,我都应该调用setMinimumBackgroundFetchInterval吗?

每个功能都应该闭包吗?

每次在组件中的onDestroy时都需要取消订阅吗?

每个不使用self参数的方法都应该是静态类吗?

每个HTML页面都应该有一个主标记吗?

每次发布后都应该关闭频道/连接吗?

VueJS和NPM-所有依赖项都应该是devDependencies吗?

每个微服务都应该管理自己的用户权限和用户角色吗?

我每次想更新内容时都需要更改网站的源代码吗?

在每个foreach语句之后,我都应该同时取消设置$ key和$ value吗?

每次基于Selenium的自动化测试后,我都应该退出浏览器吗?

所有输入都应该在Rust中是可变的吗?

所有工厂方法都应该公开吗?

页面上的每个“组件”都应该是angularJS中的指令吗?

每次制作新补丁时,都应该更改PatchCreation Element的GUID吗?

每个执行批处理后都应该提交吗?

每个片段都应该有自己的活动吗?

使用AppCompat时,我所有的活动都应该始终扩展ActionBarActivity吗?

每次访问 Weakref 对象时都应该调用它吗?

使用 createEntityAdapter 时,每个 React 组件都应该有自己的切片吗?