zoukankan      html  css  js  c++  java
  • rxjs——subject和Observable的区别

    原创文章,转载请注明出处

    理解

    observable的每个订阅者之间,是独立的,完整的享受observable流动下来的数据的。
    subject的订阅者之间,是共享一个留下来的数据的

    举例

    这里的clock$ 被订阅者被 observerA,observerB ,observerC 三个订阅者在不同的时间独自订阅。
    对于三个订阅者,clock$ 都是从头重新完成的跑一遍。

        let a=''
            const clock$ = Rx.Observable.interval(1000).take(3);
    
            const observerA = {
                next(v) {
                    a+='--A执行了,'
                    console.log('A next: ' + v)
                    console.log(a)
                }
            }
            const observerB = {
                next(v) {
                    a+='--B执行了,'
                    console.log('B next: ' + v)
                    console.log(a)
                }
            }
    
            const observerC = {
                next(v) {
                    a+='--C执行了,'
                    console.log('C next: ' + v)
                    console.log(a)
                }
            }
    
    
            clock$.subscribe(observerA) // a Observable execution
    
            setTimeout(() => {
                clock$.subscribe(observerB) // another new Observable execution
            }, 7000)
    
            setTimeout(() => {
                clock$.subscribe(observerC) // another new Observable execution
            }, 14000)
    
    /*
    A next: 0
    --A执行了,
    A next: 1
    --A执行了,--A执行了,
    A next: 2
    --A执行了,--A执行了,--A执行了,
    B next: 0
    --A执行了,--A执行了,--A执行了,--B执行了,
    B next: 1
    --A执行了,--A执行了,--A执行了,--B执行了,--B执行了,
    B next: 2
    --A执行了,--A执行了,--A执行了,--B执行了,--B执行了,--B执行了,
    C next: 0
    --A执行了,--A执行了,--A执行了,--B执行了,--B执行了,--B执行了,--C执行了,
    C next: 1
    --A执行了,--A执行了,--A执行了,--B执行了,--B执行了,--B执行了,--C执行了,--C执行了,
    C next: 2
    --A执行了,--A执行了,--A执行了,--B执行了,--B执行了,--B执行了,--C执行了,--C执行了,--C执行了,
     */
    
    

    对于subject则不同
    observerA,observerB ,observerC 三个订阅者在不同的时间订阅同一个subject。
    他们三个在时间上是共享一个subject。
    subject产生数据时,你这个订阅者如果没来得及订阅,那对不起,过了这个村就没这个店,你错过了。

    const { Observable, Subject } = Rx
    
    
    const clock$ = Observable.interval(1000).take(3);
    
    const observerA = {
      next(v) {
        console.log('A next: ' + v)
      }
    }
    const observerB = {
      next(v) {
        console.log('B next: ' + v)
      }
    }
    const subject = new Subject()
    subject.subscribe(observerA)
    
    clock$.subscribe(subject)
    
    setTimeout(() => {
      subject.subscribe(observerB)
    }, 2000)
    
    /*
     * A next: 0
     * A next: 1
     * A next: 2
     * B next: 2
     */
    
  • 相关阅读:
    temp
    Windows如何利用输入法简单的打出 ‘↑’ ‘↓’ ‘↖’等箭头
    Win10系统特别卡的一个原因
    巨蟒python全栈开发-第16天 核能来袭-初识面向对象
    在pycharm中误删了Python文件,怎么办,挺急的?
    巨蟒python全栈开发-第15天 装饰器
    巨蟒python全栈开发-第13天 内置函数 匿名函数lambda
    巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
    360浏览器的收藏夹隐藏了,怎么处理?
    如何解决安装好的google浏览器打不开网页的问题?
  • 原文地址:https://www.cnblogs.com/panfengde/p/10138899.html
Copyright © 2011-2022 走看看