Angular7知识点6----Subject(可多播的可观察对象)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34414916/article/details/85201246

Subject

在前一篇教程中了解了一下Observable可观察对象,在RxJS库中还有另外一个重要的对象——Subject,用它可以创建多播的可观察对象,接下来,我们大致了解一下

心法篇

  • 我们使用Observable创建的可观察对象只能用于单播,也就是每次订阅就代表着不同的一次订阅者函数的执行,不同的观察者之间互不干扰,(不理解的话请继续阅读,后面会有具体的例子)
  • 而我们使用Subject创建的可观察对象是可以用于多播的,也就是多个观察者共享一个订阅者函数,生产者每次发送的值,都会发送给多播中的每一个观察者!
  • Subject既可以作为可观察对象使用、又可以作为观察者使用!
  • 当Subject作为可观察对象使用的时候,其subscribe函数的作用变成了注册observer,而其next方法的作用变成了发送值

详细教程篇

1、Observable的单播

我们使用Observable创建的可观察对象只能用于单播,也就是每次订阅就代表着不同的一次订阅者函数的执行,不同的观察者之间互不干扰,具体例子如下


  
  
  1. import { of } from "rxjs";
  2. function f1() {
  3. const observable = of( 1, 2, 3);
  4. const observer1 = {
  5. next: num => console.log( "observer1.." + num)
  6. }
  7. const observer2 = {
  8. next: num => console.log( "observer2.." + num)
  9. }
  10. // 两个观察者分别订阅
  11. observable.subscribe(observer1);
  12. observable.subscribe(observer2);
  13. }
  14. f1();

运行结果如下

可以发现,这两个观察者之间互不干扰,即生产者先将值发送给observer1,再将值发送给observer2(记住这一句话,和上面运行的结果,然后对比Subject,注意它们之间的区别)

2、Subject的多播

  • 作为可观察对象的Subject

既然作为可观察对象,那么它应该有subscribe函数,并接受observer作为入参,没错,正如你期望的那样,请看下面这段代码


  
  
  1. function f2() {
  2. const subject = new Subject();
  3. const observer1 = {
  4. next: num => console.log( "observer1.." + num)
  5. }
  6. const observer2 = {
  7. next: num => console.log( "observer2.." + num)
  8. }
  9. // 注册两个观察者!注意,这里是注册,
  10. // 而不是像Observable.subscribe()那样执行订阅者函数
  11. subject.subscribe(observer1);
  12. subject.subscribe(observer2);
  13. // 执行
  14. subject.next( 1);
  15. subject.next( 2);
  16. subject.next( 3);
  17. }
  18. f2();

运行结果如下

还记得在前一小节(Observable的单播)中,我要你记住的运行结果吗?现在可以发现它们之间的区别了吗——在这里,两个observer是交替出现的,也就是,生产者将生产的每一个值先分别发送给多播中的每一个observer,然后再发送下一个值!还有,需要特别注意上面代码中的注释(回想起Observeable的subscribe函数的作用,对比Subject的subscribe函数,这两者是由区别的)

  • 作为观察者的Subject

既然作为观察者来使用,那么它是不是应该可以来订阅其他可观察对象(也就是作为入参传给Observable的subscribe函数),没错,正如你期望的那样,请看下面这段代码


  
  
  1. function f3() {
  2. // 定义一个可观察对象
  3. const observable = of( 1, 2, 3);
  4. const subject = new Subject();
  5. const observer1 = {
  6. next: num => console.log( "observer1.." + num)
  7. }
  8. const observer2 = {
  9. next: num => console.log( "observer2.." + num)
  10. }
  11. // 注册两个观察者!注意,这里是注册,
  12. // 而不是像Observable.subscribe()那样执行订阅者函数
  13. subject.subscribe(observer1);
  14. subject.subscribe(observer2);
  15. // 订阅
  16. observable.subscribe(subject);
  17. }
  18. f3();

运行结果如下

可以看到,运行结果和上面的是一样的

3、Subject(observer)订阅Subject(Observable)

为了更好的了解:Subject既可以作为观察者使用又可以作为可观察对象使用这句话,砸门有了这一小节的内容,在这一小节中,我们会新建两个Subject,让其中一个订阅另外一个,并产生与上面相同的输出,代码如下


  
  
  1. function f4(){
  2. // 作为Observable
  3. const subjectObservable = new Subject();
  4. // 作为 observer
  5. const subjectObserver = new Subject();
  6. // 新建两个观察者对象,并将其注册到subjectObserver中
  7. const observer1 = {
  8. next: num => console.log( "observer1.." + num)
  9. }
  10. const observer2 = {
  11. next: num => console.log( "observer2.." + num)
  12. }
  13. subjectObserver.subscribe(observer1);
  14. subjectObserver.subscribe(observer2);
  15. // subjectObserver订阅subjectObservable
  16. subjectObservable.subscribe(subjectObserver);
  17. // subjectObservable向在subjectObserver中注册的观察者发送值
  18. subjectObservable.next( 1);
  19. subjectObservable.next( 2);
  20. subjectObservable.next( 3);
  21. }
  22. f4();

运行结果同上,这里就不截图了,可以发现,不管Subject是作为Observable使用还是作为observer使用,它更像是一个容器,容纳“真正的”observer,(如果你还没弄明白,不要忘记去看问题篇的答案)

问题篇

讲了这么多,现在的你可以想象得到Subject的一些内幕了吗?

更新中。。。

猜你喜欢

转载自blog.csdn.net/weixin_44932450/article/details/89944977
今日推荐