Как подписчик наблюдаемого может получать испускаемые предметы (все предметы в течение времени подписки) в течение 6 секунд? - PullRequest
0 голосов
/ 06 мая 2018

Я ищу способ, с помощью которого мой наблюдаемый излучение будет через определенные промежутки времени. У меня есть служба, которая его обрабатывает, и компоненты, которые используют объект для передачи значений, и компонент, который должен получать его с интервалом в 6 секунд.

export class Service {

  constructor() {}

  private subject = new Subject<string>();
  public observable$ = this.toastMessage.asObservable();

  updateSubject(data) {
     this.subject.next(data);
  }

}

// somewhere else
export class Component {

  constructor(private srv: Service) {}

  ngOnInit() {
    this.srv.observable$.subscribe(data => {
       console.log(data, 'should emit once every 6 seconds');
    })
  }
}

// also elsewhere
export class ComponentUpdater {

  constructor(private srv: Service) {}

  ngOnInit() {
    this.srv.updateSubject('way');
    this.srv.updateSubject('to');
    this.srv.updateSubject('fast');
  }
}

Кто-нибудь знает, как я могу сделать это с помощью субъекта?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Этого можно добиться, используя bufferTimer -оператор

import { bufferTime, filter } from 'rxjs/operators';

export class Service {

  constructor() {}

  private subject = new Subject<string>();
  public observable$ = this.toastMessage.asObservable();

  updateSubject(data) {
    this.subject.next(data);
  }

}

// somewhere else
export class Component {

  constructor(private srv: Service) {}

  ngOnInit() {
    this.srv.observable$
      .pipe(
        bufferTime(6000),
        filter (data => data.length)
      )
      ^^^^^^^^^^^^^^^^^^^^^^^
      .subscribe(data => {
      console.log(data, 'should emit once every 6 seconds');
    })
  }
}

// also elsewhere
export class ComponentUpdater {

  constructor(private srv: Service) {}

  ngOnInit() {
    this.srv.updateSubject('way');
    this.srv.updateSubject('to');
    this.srv.updateSubject('fast');
  }
}
0 голосов
/ 06 мая 2018

Убедитесь, что интервал импорта

import 'rxjs/add/observable/interval';

, а затем

   Observable.interval(6000).subscribe( x => {
          this.srv.observable$.subscribe(data => {
          console.log(data, 'should emit once every 6 seconds');
         })
   })
...