订阅后立即响应

时间:2019-05-24 14:07:46

标签: angular rxjs subscribe

这是我的理论服务:

@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甚至有可能吗?

1 个答案:

答案 0 :(得分:3)

  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);
   }
 }