美文网首页
RXJS 中 Observable 和 Subject 的异同

RXJS 中 Observable 和 Subject 的异同

作者: daozun | 来源:发表于2021-03-02 21:27 被阅读0次

    最近对 RXJS 中的 ObservableSubject 有了更多的了解,特在此记录。

    1. Pull vs Push

    Producer(生产者) Consumer(消费者)
    Pull(下拉) 在被请求时才生成数据 决定何时请求数据
    Push(上交) 以自己的节奏生成数据 对接收到的数据做出响应

    pull 系统中, 消费者 决定何时从数据 生产者 中接收数据,生产者本身不知道数据何时会被传递给消费者,调用函数就是一个典型的 pull 系统,函数本身不知道何时会被调用,只有调用函数的人才知道。

    而在 push 系统中, 生产者 决定何时将数据发送给 消费者, 消费者不知道何时接收数据, Observable 就是一个典型的 push 系统。

    2. Observable

    Observable 类似于无参数的函数,但是可以输出多个值。

    Function

    function foo() {
      console.log('Hello');
      return 42;
    }
    
    var x = foo.call(); // 等同于 foo()
    console.log(x);
    var y = foo.call(); // 等同于 foo()
    console.log(y);
    

    输出:

    "Hello"
    42
    "Hello"
    42
    

    Observable

    var foo = Rx.Observable.create(function (observer) {
      console.log('Hello');
      observer.next(42);
    });
    
    foo.subscribe(function (x) {
      console.log(x);
    });
    foo.subscribe(function (y) {
      console.log(y);
    });
    

    输出:

    "Hello"
    42
    "Hello"
    42
    

    上面是相同之处,接下来说一下不同之处。

    Observable 能够同步或异步传递值, 而 Function 只能同步传递。

    Function

    function foo() {
      console.log('Hello');
      return 42;
      return 100; // 永远不会传递出去
    }
    

    Observable

    var foo = Rx.Observable.create(function (observer) {
      console.log('Hello');
      observer.next(42);
      observer.next(100);
      observer.next(200);
      setTimeout(() => {
        observer.next(300); // happens asynchronously
      }, 1000);
    });
    
    console.log('before');
    foo.subscribe(function (x) {
      console.log(x);
    });
    console.log('after');
    

    输出:

    "before"
    "Hello"
    42
    100
    200
    "after"
    300
    

    总结: Function 只能 同步 的 return 单值, 而 Observable 既可以 同步,也可以 异步 的 return 单值 或者 多值

    3. Subject

    Subject 是可以 多播 值的Observable。

    例如:

    Observable

    let obs = Observable.create(observer=>{
       observer.next(Math.random());
    })
    
    obs.subscribe(res=>{
      console.log('subscription a :', res); //subscription a :0.2859800202682865
    });
    
    obs.subscribe(res=>{
      console.log('subscription b :', res); //subscription b :0.694302021731573
    });
    

    Subject

    let obs = new Subject();
    
    obs.subscribe(res=>{
      console.log('subscription a :', res); // subscription a : 0.91767565496093
    });
    
    obs.subscribe(res=>{
      console.log('subscription b :', res); // subscription b : 0.91767565496093
    });
    
    obs.next(Math.random());
    

    从例子中可以看出, Observable 的订阅结果各 不相同,而 Subject 的订阅结果却是 相同 的,这就是把一个值 多播 到订阅者中。
    还可以看到 subject 中的观察者 obs 既可以作为 消费者,也能作为 生产者,而 Observable 中的观察者 obs 只能作为 生产者

    文章参考自:RXJS, Stack Overflow

    相关文章

      网友评论

          本文标题:RXJS 中 Observable 和 Subject 的异同

          本文链接:https://www.haomeiwen.com/subject/imqzfltx.html