有角度的http请求流何时取消订阅

时间:2017-09-26 23:57:43

标签: angular http rxjs observable

是的,我在互联网上搜索和阅读了很多讨论,但所有这些都没有回答我的问题!

Angular/RxJs When should I unsubscribe from `Subscription`

Angular 2 Subscribe / Unsubscribe Observables in case of http calls

我的任务是: angular(2+)http响应流,我需要在重新使用之后或之前取消订阅吗? 说,我有:

  private mystream$: Subscription;

  public MyTask(){
    if (this.mystream$){ this.mystream$.unsubscribe }
    this.mystream$ = http.get(url).subscribe({
      // to do
    })
  }


  ngOnDestroy() {
    if (this.mystream$) { this.mystream$.unsubscribe(); }
  }

我已经阅读过,这个取消订阅onDestroy和流变量检查在使用之前是没有必要的,但我还没有被说服,因为我的http.put通过互联网呼叫,没有保证,它将是或必须是在申请之前完成再次调用MyTask()。

请告诉我为什么我错了,这个http.put流检查在使用和清理之前没有必要,甚至通过互联网拨打,我的用户也不是病人。

1 个答案:

答案 0 :(得分:0)

此答案仅适用于您提到的情况,即针对get方法的http请求。

在角度https://angular.io/guide/observables的官方站点中,您将找到这样写的句子:“然后,订阅的用户会收到通知,直到功能完成或取消订阅为止。”这意味着订阅方法在完成后就不再被角度本身取消订阅。

要执行您创建的可观察对象并开始接收通知,请调用它的subscribe()方法,并传递一个观察者。这是一个JavaScript对象,用于定义您收到的通知的处理程序。 subscription()调用返回一个具有unsubscribe()方法的Subscription对象,您可以调用该方法停止接收通知。

以上说明表明,您可以使用unsubscribe()方法的其他优势来根据您的条件取消订阅。但永远不必强制取消订阅再使用。

现在,当我进入您的代码时,您正在ngOnDestroy中取消订阅该代码,该消息显示“现在是时候通知应用程序的另一部分该组件将要消失。”。与此组件相关的所有正在进行的订阅都已中止。与组件的变化成角度。 因此,在ngOnDestroy()方法中要求取消订阅没有任何意义。

如果我将重点放在http方法上,这是在[https://angular.io/guide/http]中找到的说明。

  

在您对由该方法返回的observable调用subscribe()之前,HttpClient方法不会开始其HTTP请求。 AsyncPipe自动为您订阅(和取消订阅)。

     

异步管道订阅Observable或Promise并返回其发出的最新值。发出新值时,异步管道会将要检查的组件标记为更改。当组件被销毁时,异步管道将自动退订,以避免潜在的内存泄漏。

一些通常我们通常使用unSubscribe()的情况

  • 清除超时以停止执行
  • 从观察者数组中删除某些内容,这样就不会再收到通知。

但是,是的,在某些情况下,您可能需要在ngOnDestroy()方法中取消订阅。但这里不需要。 从我提供的链接中浏览所有示例。它可以帮助您更好。希望我能有所帮助。