【问题标题】:How do you unsubscribe to apollo observable in angular?你如何取消订阅 angular 中的 apollo observable?
【发布时间】:2018-02-14 05:14:34
【问题描述】:

我正在使用 apollo-angular 构建一个 angular (4.x) 应用程序,我想知道如何取消订阅 apollo observables(如果你需要的话)。

我正在尝试通过创建查询来遵循 this response 中的指导:

this.query = this.apollo.watchQuery<LatestReportQueryResponse>({
  fetchPolicy: 'network-only',
  query: myQuery
});

分配一个新的主题:

  private ngUnsubscribe: Subject<void> = new Subject<void>();

订阅查询:

this.query.takeUntil(this.ngUnsubscribe).subscribe(({ data }) => {...}

然后在 onDestroy 事件循环中销毁所有活动的可观察对象,例如:

ngOnDestroy() {
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();
  }

添加.takeUntil(this.ngUnsubscribe) 后,我遇到如下lint 错误:

“Subject”类型的参数不能分配给“Observable”类型的参数。

或者当我尝试手动取消订阅 ApolloQueryObservable 时,我得到:

“ApolloQueryObservable”类型上不存在属性“取消订阅”。您指的是“订阅”吗?

apollo observables 是否需要取消订阅?

【问题讨论】:

    标签: angular rxjs graphql apollo


    【解决方案1】:

    this.query.takeUntil(this.ngUnsubscribe).subscribe(...) 的返回值应该为您提供取消订阅功能。

    订阅和保存退订功能:

    this.unsubscribe = this.query.takeUntil(this.ngUnsubscribe).subscribe(...)

    onDestroy事件循环中,调用函数:

    this.unsubscribe()

    【讨论】:

    • 感谢您的回复!我目前有你描述的设置 - 但是,当我在“this.query”(在takeunti()之前)打字稿抱怨:“'ApolloQueryObservable'类型的'this'上下文不可分配给Observable>' 类型的方法的“this”。有什么方法可以确认 observable 已完成/销毁?
    • 对不起,我不确定是否可以确认。可能写在API
    • 这是错误的。如果您有 takeUntil,则无需取消订阅。一旦 takeUntil 遇到它的回调,它就会自动取消订阅。你可以在你的答案中设置this.ngUnsubscribe = false;this.unsubscribe() 会失败,因为它不是一个函数。
    【解决方案2】:

    虽然问题正在回答,但这是一个更具体的场景,可以更多地解释这个问题,所以在此处添加下面的博客链接。 https://www.digitalocean.com/community/tutorials/angular-takeuntil-rxjs-unsubscribe

    【讨论】:

    • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
    【解决方案3】:
    import { from, Subscription } from 'rxjs';
    
    export class CalendarWeekViewStdComponent implements OnInit, OnDestroy, AfterViewInit {
    private subscriptionName: Subscription;
    
    ngOnInit() {
    this.subscriptionName = this.settingService.diarySettings.subscribe(settings => {
    
     });
    }
      ngOnDestroy(): void {
    if (this.subscriptionName) {
          this.subscriptionName.unsubscribe();
        }
    }
    }
    

    【讨论】:

      【解决方案4】:

      我们经常使用一种干净的方式,使您能够处理第二个 observable ngUnsubscribe

      它由 1-将您的订阅存储在类型的属性中:Subscription, 2 - 在销毁时,您必须调用此属性的函数 subscribe。

      如果您有多个订阅,则可以使用数组

      import { from, Subscription } from 'rxjs';
      
      private subscriptions: Subscription[] = [];
      ngOnInit() {
      this.subscriptions.push( this.settingService.diarySettings.subscribe(settings => {
      
       }));
      }
      ngOnDestroy(): void {
        this.subscriptions.forEach(sub => sub.unsubscribe());
       }
      

      【讨论】:

      • 这是正确的做法,但有一点小改动。 private subscriptions: Subscription = new Subscription(); 而不是将其设置为数组,this.subscriptions.add 而不是 .push。那么你就不必forEach,你只需说this.subscriptions.unsubscribe();,它就会取消所有的。
      猜你喜欢
      • 2018-12-12
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2021-07-22
      相关资源
      最近更新 更多