title: do (tap) vs subscribe
body: <p>Edit: Prior to RxJs 6, <code>tap</code> was called as <code>do</code> . Updated title to reflect tap too. </p>
  
  <p>I would like to understand what is the best practice of using <code>.subscribe</code> and <code>.do</code> methods of Observables.</p>
  
  <p>For example if I need to do some job after initial data is loaded from server</p>
  
  <pre><code>const init$: Observable&lt;MyData&gt; = this._dataService.getData();
  
  init$
    .do((initialData: MyData) =&gt; {
      this.data = initialData; // at this step I am initializing the view
    })
    .switchMap(() =&gt; loadExtraData)
    .subscribe((extraData) =&gt; {
       doSomething(extraData, this._data); // I need this._data here
    }); 
  </code></pre>
  
  <p>I can do the same with <code>.subscribe</code></p>
  
  <pre><code>const init$: Observable&lt;MyData&gt; = this._dataService.getData()
    .shareReplay(1);
  
  init$
    .subscribe((initialData: MyData) =&gt; {
      this.data = initialData; // at this step I am initializing the view
    })
  
  init$
    .combineLatest(loadExtraData)
    .subscribe(([initialData, extraData]) =&gt; {
       doSomething(extraData, initialData); // I need this._data here
    }); 
  </code></pre>
  
  <p>Which one is better and why?</p>