• rxjs和它的操作符


    之前一直在写LINQ之类的东西,对于函数式的面向对象还是有一些功底,所以对于rxjs,感觉上不是很难,但是每次看完过几天就忘,还是记一下笔记吧,好记性不如烂笔头真不是盖的。

    首先介绍几个重要的概念。

    可以通过这个URL来详细了解相关知识:https://www.jianshu.com/p/f2f87925b229

    rxjs中有几个重要的概念,有Observable、Observer、Subject,他们参考了观察者模式(或者叫发布/订阅模式)和迭代器模式。rxjs中有一个数据流的概念,和LINQ很类似,可以想象有一根管道,数据缓缓从管道中流过。发送数据的角色是生产者,消费数据的角色是观察者,观察者要想消费数据的话得知道生产者什么时候发送数据,也就是说,观察者要从生产者订阅一下通知,以便及时消费数据,这个过程就是由Observable来完成的。

    Observable

    Observevable是一个对象,如果要创建一个Observable,可以从如下两个例子来看:

     const observable$ = new Observable<number>(observer => {
          observer.next(1);
          observer.next(2);
          observer.next(3);
          observer.next(4);
          return {
            unsubscribe: () => {
              console.log('complete');
            }
          };
        });
        const subscription = observable$.subscribe(value => console.log(value));

    如上,生产者就是next(1)啊,next(2)啊中的1和2,Observable<number>则表示这个生产者是一个要发送number类型的生产者,给构造函数传入的function是一个接受一个observer的函数,这个observer对象拥有三个方法分别是next、error和complete。其中next方法用来消费生产者发送出来的数据,error用来捕获错误,complete用来通知完成。没错,这个observer就是一个观察者,观察者用来消费生产者发布的数据。

    Observable内部可以想象成这样的一种结构:

    class observable<T> {
      _subscribe: (observer: Observer<T>) => Unsubscribable;
      constructor(subscriber: (observer: Observer<T>) => Unsubscribable) {
        this._subscribe = subscriber;
      }
      subscribe(observer: Observer<T>): Unsubscribable {
        this._subscribe(observer);
        return { unsubscribe: () => console.log('complete') };
      }
    }

    上面的代码简单的诠释了一个Observable的内部结构,Observer<T>是一个观察者,它拥有next、complete和error三个方法。

    除了上面这些,Observable还有冷和热的的区别,这个以后补充,现在着急介绍下一个功能。

    Subject

    subject是Observable和Observer的结合,从Observable来看,subject本身是继承了Observable,从Observer来看,subject是observer的鸭子类型(兼容)。Subject的内部是这样的:

    class subject<T> {
      _observers: Observer<T>[];
      subscribe(observer: Observer<T>): void {
        this._observers.push(observer);
      }
      next(value) {
        this._observers.forEach(item => item.next(value));
      }
      complete() {
        this._observers.forEach(item => item.complete());
      }
      error(value) {
        this._observers.forEach(err => err.error(value));
      }
    }

    不同于Observable的是Subject是多播的(组播),它可以通过一个生产者调动多个观察者。

    基础的只知识就介绍到这里,下面介绍操作符。

  • 相关阅读:
    高可用、高并发浅析
    正则表达式笔记
    linux下通过脚本切换当前工作目录
    nginx学习笔记
    二进制安全
    负载均衡相关
    有用的shell命令
    TCP服务器/客户端代码示例
    UDP服务器/客户端代码示例
    GCC链接的几个注意点
  • 原文地址:https://www.cnblogs.com/pangjianxin/p/9952979.html
Copyright © 2020-2023  润新知