!!!!!!!!!!!!!!!
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
...