Skip to content

Instantly share code, notes, and snippets.

@xaliphostes
Last active January 14, 2021 18:31
Show Gist options
  • Save xaliphostes/b992cabefbf8601aa817d473b825f34c to your computer and use it in GitHub Desktop.
Save xaliphostes/b992cabefbf8601aa817d473b825f34c to your computer and use it in GitHub Desktop.

Reproduces RxJs behavior

There is no generic operators as in RxJs yet, but the main idea behind is presented here...

function map(transformFn) {
return createObservable( outputObserver => {
this.subscribe({
next: x => {
const y = transformFn(x)
outputObserver.next(y)
},
error: e => outputObserver.error(e),
complete: () => outputObserver.complete
})
})
}
function filter(filterFn) {
return createObservable( outputObserver => {
this.subscribe({
next: x => {
if (filterFn(x)) outputObserver.next(x)
},
error: e => outputObserver.error(e),
complete: () => outputObserver.complete
})
})
}
function delay(timeout) {
return createObservable( outputObserver => {
this.subscribe({
next: x => {
setTimeout(() => {
outputObserver.next(x)
}, timeout);
},
error: e => outputObserver.error(e),
complete: () => outputObserver.complete
})
})
}
const createObservable = subscribe => {
return { subscribe, map, filter, delay }
}
// =============================================================
// Testing
// =============================================================
// One of our own observable (1st)
const arrayObservable = createObservable( observer => {
[10, 20, 30].forEach( observer.next )
observer.complete()
})
// One of our own observable (2nd)
const clickObservable = createObservable( observer => {
document.addEventListener('click', observer.next)
})
// Our own observer
const observer = {
next : (data) => console.log(data),
error : (data) => console.error(data),
complete: () => console.info('done')
}
// Do the subscriptions
arrayObservable
.map( x => x/10 )
.filter( x => x != 2 )
.subscribe(observer)
clickObservable
.map( ev => ev.clientX )
.filter( x => x<200 )
.delay(500)
.subscribe(observer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment