Skip to content

Instantly share code, notes, and snippets.

@joshorvis
Forked from orod/rxjs subjects.md
Created February 11, 2018 04:14
Show Gist options
  • Select an option

  • Save joshorvis/09617b5f15c9851d0fcaf63038c46ca0 to your computer and use it in GitHub Desktop.

Select an option

Save joshorvis/09617b5f15c9851d0fcaf63038c46ca0 to your computer and use it in GitHub Desktop.

Revisions

  1. Oscar Rodriguez revised this gist Jul 29, 2016. 1 changed file with 6 additions and 14 deletions.
    20 changes: 6 additions & 14 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,6 @@
    1 source, Three subscribers
    Subscriber 1 subscribes and source starts emitting
    Subscriber 2 subscribes halfway
    1 source, Three subscribers
    Subscriber 1 subscribes and source starts emitting
    Subscriber 2 subscribes halfway
    Subscriber 3 subscribes after source has completed.


    @@ -20,34 +20,26 @@ setTimeout(function () {
    }, 10000);
    var subSubject1 = subject.subscribe(
    function (x) { console.log('Value published to observer #1: ' + x); },
    function (x) { console.log('Value published to observer 1: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 1'); });
    setTimeout(function () {
    var subSubject2 = subject.subscribe(
    function (x) { console.log('Value published to observer #2: ' + x); },
    function (x) { console.log('Value published to observer 2: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 2'); }
    );
    }, 5000);
    setTimeout(function () {
    var subSubject3 = subject.subscribe(
    function (x) { console.log('Value published to observer #3: ' + x); },
    function (x) { console.log('Value published to observer 3: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 3'); }
    );
    }, 12000);
    setTimeout(function () {
    var subSubject4 = subject.subscribe(
    function (x) { console.log('Value published to observer #4: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 4'); }
    );
    }, 15000);
    var myInterval = setInterval(function () {
    data.push(data.length);
    subject.next(data);
  2. Oscar Rodriguez revised this gist Jul 29, 2016. 1 changed file with 5 additions and 3 deletions.
    8 changes: 5 additions & 3 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -56,7 +56,7 @@ var myInterval = setInterval(function () {
    ```


    #### var subject = new Rx.ReplaySubject(1);
    ## With var subject = new Rx.ReplaySubject(1);

    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    @@ -79,7 +79,7 @@ index.js:65 onCompleted 2
    index.js:75 onCompleted 3


    #### var subject = new Rx.BehaviorSubject(data);
    ## With var subject = new Rx.BehaviorSubject(data);

    **Value published to observer 1:**
    index.js:31 Value published to observer 1: 0
    @@ -102,7 +102,7 @@ index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*


    #### var subject = new Rx.Subject();
    ## With var subject = new Rx.Subject();

    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    @@ -123,6 +123,8 @@ index.js:65 onCompleted 2
    **index.js:75 onCompleted 3**


    ## ====

    BehaviorSubject emits initial value (before next() happens)
    Subject, ReplaySubject emits on next(), not initial value

  3. Oscar Rodriguez revised this gist Jul 29, 2016. 1 changed file with 62 additions and 61 deletions.
    123 changes: 62 additions & 61 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -59,74 +59,75 @@ var myInterval = setInterval(function () {
    #### var subject = new Rx.ReplaySubject(1);

    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    index.js:61 Value published to observer 2: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:71 Value published to observer #3: 0,1,2,3,4,5,6,7,8*
    index.js:75 onCompleted 3
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    index.js:61 Value published to observer 2: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:71 Value published to observer #3: 0,1,2,3,4,5,6,7,8*
    index.js:75 onCompleted 3


    #### var subject = new Rx.BehaviorSubject(data);
    **Value published to observer 1:**
    index.js:31 Value published to observer 1: 0
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    **index.js:31 Value published to observer 1: 0,1,2,3**
    **index.js:61 Value published to observer 2: 0,1,2,3**
    index.js:31 Value published to observer 1: 0,1,2,3,4
    index.js:61 Value published to observer 2: 0,1,2,3,4
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*

    **Value published to observer 1:**
    index.js:31 Value published to observer 1: 0
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    **index.js:31 Value published to observer 1: 0,1,2,3**
    **index.js:61 Value published to observer 2: 0,1,2,3**
    index.js:31 Value published to observer 1: 0,1,2,3,4
    index.js:61 Value published to observer 2: 0,1,2,3,4
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*


    #### var subject = new Rx.Subject();

    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    **index.js:75 onCompleted 3**


    BehaviorSubject emits initial value (before next() happens)
    Subject, ReplaySubject emits on next(), not initial value

    ReplaySubject returns value even after complete()
    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    **index.js:75 onCompleted 3**


    BehaviorSubject emits initial value (before next() happens)
    Subject, ReplaySubject emits on next(), not initial value

    ReplaySubject returns value even after complete()
    Subject, BehaviorSubject do not

    ReplaySubject, BehaviorSubject give the current value on subscription
    ReplaySubject, BehaviorSubject give the current value on subscription
    Subject emits on next()
  4. Oscar Rodriguez revised this gist Jul 29, 2016. 1 changed file with 46 additions and 48 deletions.
    94 changes: 46 additions & 48 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -58,70 +58,68 @@ var myInterval = setInterval(function () {

    #### var subject = new Rx.ReplaySubject(1);

    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    index.js:31 Value published to observer #1: 0,1,2,3
    index.js:61 Value published to observer #2: 0,1,2,3
    *index.js:31 Value published to observer #1: 0,1,2,3,4*
    *index.js:61 Value published to observer #2: 0,1,2,3,4*
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    index.js:61 Value published to observer 2: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:71 Value published to observer #3: 0,1,2,3,4,5,6,7,8*
    index.js:75 onCompleted 3


    #### var subject = new Rx.BehaviorSubject(data);

    *Value published to observer #1: *
    index.js:31 Value published to observer #1: 0
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    *index.js:31 Value published to observer #1: 0,1,2,3*
    *index.js:61 Value published to observer #2: 0,1,2,3*
    index.js:31 Value published to observer #1: 0,1,2,3,4
    index.js:61 Value published to observer #2: 0,1,2,3,4
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    **Value published to observer 1:**
    index.js:31 Value published to observer 1: 0
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    **index.js:31 Value published to observer 1: 0,1,2,3**
    **index.js:61 Value published to observer 2: 0,1,2,3**
    index.js:31 Value published to observer 1: 0,1,2,3,4
    index.js:61 Value published to observer 2: 0,1,2,3,4
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*


    #### var subject = new Rx.Subject();

    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    index.js:31 Value published to observer #1: 0,1,2,3
    *index.js:31 Value published to observer #1: 0,1,2,3,4*
    *index.js:61 Value published to observer #2: 0,1,2,3,4*
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    **Value published to observer 1: 0**
    index.js:31 Value published to observer 1: 0,1
    index.js:31 Value published to observer 1: 0,1,2
    index.js:31 Value published to observer 1: 0,1,2,3
    **index.js:31 Value published to observer 1: 0,1,2,3,4**
    **index.js:61 Value published to observer 2: 0,1,2,3,4**
    index.js:31 Value published to observer 1: 0,1,2,3,4,5
    index.js:61 Value published to observer 2: 0,1,2,3,4,5
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer 1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer 2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*

    **index.js:75 onCompleted 3**


    BehaviorSubject emits initial value (before next() happens)
  5. Oscar Rodriguez revised this gist Jul 29, 2016. 1 changed file with 3 additions and 0 deletions.
    3 changes: 3 additions & 0 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -57,6 +57,7 @@ var myInterval = setInterval(function () {


    #### var subject = new Rx.ReplaySubject(1);

    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    @@ -79,6 +80,7 @@ index.js:75 onCompleted 3


    #### var subject = new Rx.BehaviorSubject(data);

    *Value published to observer #1: *
    index.js:31 Value published to observer #1: 0
    index.js:31 Value published to observer #1: 0,1
    @@ -101,6 +103,7 @@ index.js:65 onCompleted 2


    #### var subject = new Rx.Subject();

    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
  6. Oscar Rodriguez created this gist Jul 29, 2016.
    131 changes: 131 additions & 0 deletions rxjs subjects.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,131 @@
    1 source, Three subscribers
    Subscriber 1 subscribes and source starts emitting
    Subscriber 2 subscribes halfway
    Subscriber 3 subscribes after source has completed.


    ```
    import Rx from 'rxjs/Rx';
    var data = [];
    var subject = new Rx.ReplaySubject(1);
    // var subject = new Rx.BehaviorSubject(data);
    // var subject = new Rx.Subject();
    setTimeout(function () {
    // Clean up
    subject.complete();
    clearInterval(myInterval);
    }, 10000);
    var subSubject1 = subject.subscribe(
    function (x) { console.log('Value published to observer #1: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 1'); });
    setTimeout(function () {
    var subSubject2 = subject.subscribe(
    function (x) { console.log('Value published to observer #2: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 2'); }
    );
    }, 5000);
    setTimeout(function () {
    var subSubject3 = subject.subscribe(
    function (x) { console.log('Value published to observer #3: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 3'); }
    );
    }, 12000);
    setTimeout(function () {
    var subSubject4 = subject.subscribe(
    function (x) { console.log('Value published to observer #4: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted 4'); }
    );
    }, 15000);
    var myInterval = setInterval(function () {
    data.push(data.length);
    subject.next(data);
    }, 1000);
    ```


    #### var subject = new Rx.ReplaySubject(1);
    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    index.js:31 Value published to observer #1: 0,1,2,3
    index.js:61 Value published to observer #2: 0,1,2,3
    *index.js:31 Value published to observer #1: 0,1,2,3,4*
    *index.js:61 Value published to observer #2: 0,1,2,3,4*
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:71 Value published to observer #3: 0,1,2,3,4,5,6,7,8*
    index.js:75 onCompleted 3


    #### var subject = new Rx.BehaviorSubject(data);
    *Value published to observer #1: *
    index.js:31 Value published to observer #1: 0
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    *index.js:31 Value published to observer #1: 0,1,2,3*
    *index.js:61 Value published to observer #2: 0,1,2,3*
    index.js:31 Value published to observer #1: 0,1,2,3,4
    index.js:61 Value published to observer #2: 0,1,2,3,4
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*


    #### var subject = new Rx.Subject();
    *Value published to observer #1: 0*
    index.js:31 Value published to observer #1: 0,1
    index.js:31 Value published to observer #1: 0,1,2
    index.js:31 Value published to observer #1: 0,1,2,3
    *index.js:31 Value published to observer #1: 0,1,2,3,4*
    *index.js:61 Value published to observer #2: 0,1,2,3,4*
    index.js:31 Value published to observer #1: 0,1,2,3,4,5
    index.js:61 Value published to observer #2: 0,1,2,3,4,5
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7
    index.js:31 Value published to observer #1: 0,1,2,3,4,5,6,7,8
    index.js:61 Value published to observer #2: 0,1,2,3,4,5,6,7,8
    index.js:35 onCompleted 1
    index.js:65 onCompleted 2
    *index.js:75 onCompleted 3*



    BehaviorSubject emits initial value (before next() happens)
    Subject, ReplaySubject emits on next(), not initial value

    ReplaySubject returns value even after complete()
    Subject, BehaviorSubject do not

    ReplaySubject, BehaviorSubject give the current value on subscription
    Subject emits on next()