Немедленный ответ после подписки - PullRequest
1 голос
/ 24 мая 2019

Это мой теоретический сервис:

@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 Ответ

3 голосов
/ 24 мая 2019
  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);
   }
 }
...