Angular2 Observable - 如何从Observable的构造函数外部调用next

时间:2017-01-25 18:42:06

标签: angular rxjs

我正在构建一个暴露Observable的服务。在这个服务中,我接收外部函数调用,它应该触发Observable的下一个调用,以便各种消费者获得订阅事件。在Observer构造函数中,我可以调用next,一切都很好,但是如何在构造函数外部访问它,以便外部触发器可以触发下一个调用?

private myObservable$: Observable<any>;

在服务初始化期间我做

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

然后在同一服务的其他方法中,我希望能够执行类似

的操作
this.myObservable$.observer.next("next message");

上述情况显然无效,但我怎样才能实现这一目标?

我假设我遗漏了一些基本内容,因为必须有一种方法可以在Observable的初始构造函数之外发出更多消息

4 个答案:

答案 0 :(得分:26)

您应该为该

创建Subject
this.myObservable$ = new Subject();

然后你可以随时打电话:

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

或使用subscribe:

this.myObservable$.subscribe(...)

答案 1 :(得分:5)

实际上Subject用于发布商和订阅者,在这里我认为您只需要发布您的值,所以只需使用Observable。

通过使用observable,将Subscriber分配给类级变量,然后使用它,如下面的代码

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

答案 2 :(得分:2)

两种方式:

  1. make myObservable $ public:

    public myObservable$: Observable;
    
  2. 将observable封装在主题流中,并提供一个帮助来调用下一个:

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

答案 3 :(得分:0)

可观察的:您只能在构造函数中调用next()函数,并且只有一次可以订阅

message = new Observable((observer)=>{
   observer.next(9);
})

this.messsage.subscribe((res)=>{
   console.log(res)
})

output: 9

主题:您只能在构造函数外部调用next()函数,并且可以多次订阅。 订阅前该主题不存储任何初始值。

messsage = new Subject()
this.messsage.next(3)
this.messsage.subscribe((res)=>{
   console.log(' A '+res)
})
this.messsage.next(4)
this.messsage.next(5)
this.messsage.subscribe((res)=>{
   console.log(' B '+res)
})
this.messsage.next(6)

output: 
A 4
A 5
A 6
B 6

BehaviorSubject::您只能在构造函数外部调用next()函数,并且可以多次订阅。 BehaviorSubject在订阅之前确实只存储一个初始值。

messsage = new BehaviorSubject ()
this.messsage.next(3)
this.messsage.subscribe((res)=>{
   console.log(' A '+res)
})
this.messsage.next(4)
this.messsage.next(5)
this.messsage.subscribe((res)=>{
   console.log(' B '+res)
})
this.messsage.next(6)

output: 
A 3
A 4
A 5
B 5
A 6
B 6