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(...)
два варианта:
-
сделать myObservable$ public:
public myObservable$: Observable;
-
Инкапсулируйте наблюдаемое в поток темы и предоставьте помощник для вызова 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();
}
}