首页 > 解决方案 > 订阅后立即响应

问题描述

这是我的理论服务:

@Injectable({
  providedIn: 'root'
})
export class DataService {
  @Output() data: EventEmitter<number> = new EventEmitter();

  constructor() {
    setInterval(() => {
      this.data.emit(Math.random());
    }, 1e3);
  }
}

我的组件:

  ngOnInit() {
    this.sub = this.dataService.data.subscribe(data => this.data = data);
  }

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

效果很好,我有新数据。但是如何更改我的 DataService 以在订阅后立即提供数据。我的意思是,我想存储最后一个数据(在这种理论情况下是随机数)并在订阅后立即提供。这甚至可以使用 rxjs 吗?

标签: angularrxjssubscribe

解决方案


  1. 不要使用事件发射器代替主题,它们不能保证始终遵循可观察合同

  2. 不要在服务中使用输出,它仅适用于组件和指令

  3. 使用行为主体让新订阅者在订阅时立即获得最后发出的值

  4. 将主题设为私有并公开可观察对象的良好做法

像这样:

 @Injectable({
   providedIn: 'root'
 })
 export class DataService {
   private data: BehaviorSubject<number> = new BehaviorSubject(null); // initialize to whatever
   data$: Observable<number> = this.data.asObservable();

   constructor() {
     setInterval(() => {
       this.data.next(Math.random()); // use next for subjects
     }, 1e3);
   }
 }

推荐阅读