!!!!!!!!!!!!!!!

by Leo

HTML

<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/5.1.1/Rx.js"></script>
<button id="saveBtn">Save data</button>
<button id="saveFailedBtn">Save data failed</button>
<button id="loadBtn">Load data</button>
<button id="loadFailedBtn">Load data failed</button>

JavaScript

//https://github.com/Reactive-Extensions/RxJS/issues/648
//https://github.com/Reactive-Extensions/RxJS/issues/1036 global error handling on combine latest
//http://reactivex.io/documentation/operators/refcount.html
//https://jsfiddle.net/goleon/2p3kuawk/ publish-refcount example 
let actions$ = new Rx.Subject();

let data = 0;
const loadBtnClicks$ = 
   Rx.Observable.fromEvent(document.querySelector('#loadBtn'), 'click').forEach(()=>{
     actions$.next({type: 'load_data', data: --data}); 
   })

const loadFailedBtnClicks$ = 
   Rx.Observable.fromEvent(document.querySelector('#loadFailedBtn'), 'click').forEach(()=>{
     actions$.next({type: 'load_data', error: "ERROR"}); 
   })

const saveBtnClicks$ = 
  Rx.Observable.fromEvent(document.querySelector('#saveBtn'), 'click').forEach(()=>{
    actions$.next({type: 'save_data', data: ++data}); 
  })

const saveFailedBtnClicks$ = 
  Rx.Observable.fromEvent(document.querySelector('#saveFailedBtn') , 'click').forEach(()=>{
    actions$.next({type: 'save_data', error: "ERROR"}); 
  })

//let sault = Rx.Observable.of(" 42").publish().refCount();
let sault$ = actions$.filter((a)=> a.type == 'sault')
setTimeout(()=>{actions$.next({type: 'sault'});}, 2000)

/////////////////////////////////////////    save    ///////////////////////////////////////////////////////
//increments data, does not catch error
let saveData$ = 
   actions$.filter((a)=> a.type == 'save_data')
  .combineLatest(sault$, (a,s) => {console.log("!!!! sault "); return a;})
  .switchMap((a) => {
           return !a.error 
                     ? Rx.Observable.of({data: " --> " + a.data}).delay(1000) 
                     : Rx.Observable.throw('test').materialize().delay(1000).dematerialize();
   });

////////////////////////////////////////    load    ////////////////////////////////////////////////////////
//decrements data, cacthes error
let loadData$ = 
   actions$.filter((a)=> a.type == 'load_data')
  .switchMap((a) => {
           return !a.error 
     ...