【问题标题】:Stop observable stream of shared data service Angular停止共享数据服务 Angular 的可观察流
【发布时间】:2018-07-06 01:42:40
【问题描述】:

我有这项服务可以在我的应用程序的组件之间共享数据:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class DataService {

    private source = new BehaviorSubject<any>('');
    data = this.source.asObservable();

    constructor() { }

    update(values: any) {
        this.source.next(values);
    }
}

从一个组件,我像这样更新数据:

this.dataSvc.update(this.data);

假设 this.data 是一个对象。

从另一个组件,我订阅服务

this.dataSvc.data.subscribe(
    data => let object = data,
    error => console.log(error),
    () => console.log('complete')
);

从不调用完整方法。 如何调用完整的方法并停止订阅?
我尝试在下一次服务之后添加this.source.complete()。它不起作用

谢谢

【问题讨论】:

  • 试试this.dataSvc.data.take(1).subscribe(...)
  • 我不能使用 take。注意一个函数
  • 需要导入take操作符...import 'rxjs/add/operator/take'
  • 它可以工作,但是我可以停止向我的服务发送?

标签: angular observable subscription


【解决方案1】:

Observable 永远不会完成的原因是你永远不会取消订阅它。

您可以使用takeUntil 之类的运算符(如果您想取消订阅某个条件),但我感觉您只需要在组件被销毁时清理您的订阅即可。以下是如何做到这一点的几个选项:

当组件被销毁时,您可以使用ngOnDestroy 生命周期挂钩取消订阅此订阅。

试试这个:

subscription: Subscription;

/* using ngOnInit life cycle hook for the example, 
   but you could assign the subscription anywhere */
ngOnInit() { 
  this.subscription = this.dataSvc.data.subscribe( //.. )
}

ngOnDestroy() {
  this.subscription.unsubscribe();
}

问题是您正在设置订阅,但从未清理它,因此 Observable 永远不会“完成”。上面的代码将解决这个问题。

或者,如果您只需要模板中的数据而不需要组件类中的数据,则可以使用async 管道。

在您的component.ts 文件中:

data$: Observable<Data>;
ngOnInit() {
  this.data$ = this.dataSvc.data;
}

然后在你的模板中:

 <p> {{ data$ | async }} </p>

当你的组件被销毁时,Angular 会为你处理所有的清理工作:)

这里有一些关于life cycle hooksunsubscribe 方法和async pipe 的链接。

【讨论】:

  • 谢谢,我会试试的
  • 好的 - 让我知道它是否有效或者您的问题是否仍需要回答
  • 乐于提供帮助,请考虑通过单击复选标记“接受”答案,以便其他人知道您的问题已得到解答。欢迎来到 SO :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2019-05-21
  • 2017-04-15
  • 2017-05-17
  • 2018-04-29
  • 1970-01-01
相关资源
最近更新 更多