zoukankan      html  css  js  c++  java
  • [RxJS] Connection operator: multicast and connect

    We have seen how Subjects are useful for sharing an execution of an RxJS observable to multiple observers. However, this technique requires some laborious setting up. In this lesson we will learn about the multicast() operator which helps solve the same problem with less code, and with a neater API.

    Let's go back and remember why did we need subjects in the first place? Originally, we had one typical observable, but we wanted two observers A and B, to see the same execution of that observable.

    Does that mean that every time that we want to have multiple observers we need to set up a subject, and subscribe to the observables, subscribe to the subjects?

    This system is not so ergonomic to set up. That's why there exists an operator or a method that simplifies all of this for us. That would be multicastmulticastis an operator on a normal observable. It takes here an argument, which is a subject.

    // var source = Rx.Observable
    //                .interval(100)
    //                .take(5);
    // var subject = new Rx.Subject();
    // source.subscribe(subject);
    var connectableObservable = Rx.Observable
                  .interval(100)
                  .take(5)
                  .multicast(new Rx.Subject());
    connectableObservable.connect();
    
    var observerA = {
      next: function (x) { console.log('A next ' + x); },
      error: function (err) { console.log('A error ' + err); },
      complete: function () { console.log('A done'); },
    };
    
    connectableObservable.subscribe(observerA);
    console.log('observerA subscribed');
    
    var observerB = {
      next: function (x) { console.log('B next ' + x); },
      error: function (err) { console.log('B error ' + err); },
      complete: function () { console.log('B done'); },
    };
    
    setTimeout(function () {
      connectableObservable.subscribe(observerB);
      console.log('observerB subscribed');
    }, 300);

    Now when we connect this observable, this connectableObservable, it will use a ReplaySubject to subscribe to this observable. That means that when the late observer arrives here, it will see the last values replayed to it. If we run this B arrives late, but B sees the latest values, zero and one, for instance.

    // var source = Rx.Observable
    //                .interval(100)
    //                .take(5);
    // var subject = new Rx.Subject();
    // source.subscribe(subject);
    var connectableObservable = Rx.Observable
                  .interval(100)
                  .take(5)
                  .multicast(new Rx.ReplaySubject(100));
    connectableObservable.connect();
    
    var observerA = {
      next: function (x) { console.log('A next ' + x); },
      error: function (err) { console.log('A error ' + err); },
      complete: function () { console.log('A done'); },
    };
    
    connectableObservable.subscribe(observerA);
    console.log('observerA subscribed');
    
    var observerB = {
      next: function (x) { console.log('B next ' + x); },
      error: function (err) { console.log('B error ' + err); },
      complete: function () { console.log('B done'); },
    };
    
    setTimeout(function () {
      console.log('observerB subscribed');
      connectableObservable.subscribe(observerB);
    }, 300);
    /*"observerA subscribed"
    "A next 0"
    "A next 1"
    "A next 2"
    "observerB subscribed"
    "B next 0"
    "B next 1"
    "B next 2"
    "A next 3"
    "B next 3"
    "A next 4"
    "B next 4"
    "A done"
    "B done"*/
  • 相关阅读:
    SAM4E单片机之旅——2、LED闪烁之轮询定时器
    SAM4E单片机之旅——1、LED闪烁之空循环
    C#使用WinAPI 修改电源设置,临时禁止笔记本合上盖子时睡眠
    阻止系统自动睡眠的小软件,附C#制作过程
    Python3做采集
    判断浏览器类型
    任意几个数求和
    常见Z纯CSS小样式合集(三角形)
    数据脱敏项目中遇见的问题
    点击左侧跳到右侧
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5978935.html
Copyright © 2011-2022 走看看