Angular2 Observable - как вызвать next извне конструктора Observable

Я строю службу, которая выставляет наблюдаемое. В этой службе я получаю внешние вызовы функций, которые должны вызвать следующий вызов наблюдаемого, чтобы различные потребители получили событие subscribe. Во время конструктора Observer я могу вызвать next, и все работает отлично, но как я могу получить доступ к этому вне конструктора, чтобы внешние триггеры могли запускать следующие вызовы?

private myObservable$: Observable<any>;

во время службы init я делаю

this.myObservable$ = new Observable(observer => {
    observer.next("initial message");
}

тогда в других методах тот же сервис я хочу иметь возможность выполнить что-то вроде

this.myObservable$.observer.next("next message");

все вышесказанное не сработает, но как я могу достичь этой цели?

Я предполагаю, что мне не хватает чего-то основного, так как должен быть способ испускать дальнейшие сообщения вне начального конструктора Observable

3 ответов


вы должны создать Subject для этого

this.myObservable$ = new Subject();

и тогда вы можете позвонить в любой момент:

this.myObservable$.next(...);

или используйте subscribe:

this.myObservable$.subscribe(...)

два варианта:

  1. сделать myObservable$ public:

    public myObservable$: Observable;
    
  2. Инкапсулируйте наблюдаемое в поток темы и предоставьте помощник для вызова next:

    export class TestService {
      public myObservable$: Observable;
      private _myObservableSubject: Subject;
    
      constructor() {
        this._myObservableSubject = new Subject();
        this.myObservable$ = this._myObservableSubject.asObservable();
      }
    
      public NextMessage(message?: string): void {
        this._myObservableSubject.next(message);  
      }
    }
    

на самом деле Subject используется для обоих издатель и подписчик, и здесь, я думаю, вам нужно только опубликовать свое значение, поэтому просто используйте Observable.

используя observable, назначьте подписчика переменной уровня класса, а затем используйте ее, как показано ниже code

subscriber: Subscriber<boolean>;

public observe(): Observable<boolean> {

    return new Observable<boolean>(subs => {
      this.subscriber = subs;
    });
  }

public callNext() {

    if (this.subscriber) {
      this.subscriber.next();
      this.subscriber.complete();
    }
  }