+-------+ +--------+ +--------+
| Start | | Cancel | |Confirm?|
+---+---+ +---+----+ +---+----+
| | ^
| | |
| +---------------+ |
| v v |
| +----+-----+ +-+---+----+
| | | | |
+--------> | doBitmap +-----> | doDialog +------>
| | | |
+----------+ +----------+
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.6/Rx.js"></script>
class Bitmap {
constructor(i) {
this.i = i;
}
}
function doBitmap() {
return Rx.Observable.create(observer => {
// Do stuff, send stuff
return () => {
console.log('doBitmap disposed/unsubscribed!');
}
});
}
function doBitmap() {
return Rx.Observable.create(observer => {
// Do stuff, send stuff
observer.next(); //*
observer.complete(); //*
return () => {
console.log('doBitmap disposed/unsubscribed!');
}
});
}
function doBitmap() {
return Rx.Observable.create(observer => {
console.log('doBitmap started...');
const bitmap = new Bitmap(0);
const timeout = setInterval(() => {
bitmap.i += 1;
console.log('doBitmap progress', bitmap.i);
if (bitmap.i >= 4) {
observer.next(bitmap); //*
observer.complete(); //*
cleanup();
}
}, 1000);
function cleanup() { clearTimeout(timeout); }
return () => {
console.log('doBitmap disposed!');
cleanup(); //*
}
});
}
doBitmap();
doBitmap().subscribe(bitmap => { console.log('doBitmap ->', bitmap); });
No Objects/Classes == Functional Reactive Programming
<button id="startButton">
Start
</button>
<button id="cancelButton">
Cancel
</button>
const start$ = Rx.Observable.create(observer => {
return () => {
};
});
const start$ = Rx.Observable.create(observer => {
const button = document.getElementById('startButton');
const eventListener = _ => {
observer.next(1);
}
button.addEventListener('click', eventListener);
return () => {
button.removeEventListener('click', eventListener);
};
});
start$.subscribe(() => console.log('START'));
<button onClick="cancelButton();">
Cancel
</button>
const cancel$ = new Rx.Subject();
window.cancelButton = () => {
cancel$.next();
}
cancel$.subscribe(() => console.log('CANCEL'));
start$.map(_ => doBitmap())
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
start$.flatMap(_ => doBitmap())
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
start$.switchMap(_ => doBitmap())
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
const sub = start$.switchMap(_ => doBitmap())
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
cancel$.subscribe(_ => sub.unsubscribe());
start$.switchMap(_ => doBitmap())
.takeUntil(cancel$)
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
function doDialog() {
return Rx.Observable.create(observer => {
return () => {
};
})
}
function doDialog() {
return Rx.Observable.create(observer => {
console.log('doDialog starting...');
let button = document.createElement('button');
button.innerHTML = "Confirm?";
button.onclick = _ => {
console.log('Dialog click');
observer.next(1); //*
observer.complete(); //*
cleanup();
};
document.body.appendChild(button);
function cleanup() { if (button) { button.remove() } }
return () => {
console.log('doDialog disposed!');
cleanup();
};
})
}
doDialog();
doDialog().subscribe(x => console.log('CONFIRM', x));
start$.switchMap(_ => doBitmap())
.map(bitmap => doDialog()) //*
.takeUntil(cancel$)
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
start$.switchMap(_ => doBitmap())
.flatMap(bitmap => doDialog()) //*
.takeUntil(cancel$)
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));
Cancel clears button, but:
- Cannot restart
- Cancel is wonky
start$.switchMap(_ => //*
doBitmap()
.flatMap(bitmap => doDialog())
.takeUntil(cancel$)
)
.subscribe(bitmap => console.log('Final Bitmap: ', bitmap));