RxJS catch
by Leo
HTML
<script src="//cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.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
let actions$ = new Rx.Subject();
let data = 0;
const loadBtnClicks$ =
Rx.Observable.fromEvent(document.querySelector('#loadBtn'), 'click').forEach(()=>{
actions$.onNext({type: 'load_data', data: --data});
})
const loadFailedBtnClicks$ =
Rx.Observable.fromEvent(document.querySelector('#loadFailedBtn'), 'click').forEach(()=>{
actions$.onNext({type: 'load_data', error: "ERROR"});
})
const saveBtnClicks$ =
Rx.Observable.fromEvent(document.querySelector('#saveBtn'), 'click').forEach(()=>{
actions$.onNext({type: 'save_data', data: ++data});
})
const saveFailedBtnClicks$ =
Rx.Observable.fromEvent(document.querySelector('#saveFailedBtn') , 'click').forEach(()=>{
actions$.onNext({type: 'save_data', error: "ERROR"});
})
let sault = Rx.Observable.of(" 42");
///////////////////////////////////////// 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
? Rx.Observable.of({data: " <-- " + a.data}).delay(1000)
: Rx.Observable.throw('test').materialize().delay(1000).dematerialize()
.catch((err) => {
...