Skip to content

Instantly share code, notes, and snippets.

@matthewboman
Created August 28, 2018 16:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matthewboman/2950e58bc1cc2d524b35e4931283149f to your computer and use it in GitHub Desktop.
Save matthewboman/2950e58bc1cc2d524b35e4931283149f to your computer and use it in GitHub Desktop.
An ES6 Observable example
class Observable {
constructor(fn) {
this.fn = fn
}
subscribe(next, error, complete) {
if (typeof next === "function") {
return this.fn({
next,
error: error || (() => {}),
complete: complete || (() => {})
})
} else {
return this.fn(next)
}
}
map(fn) {
return new Observable(observer => {
return this.subscribe(
val => observer.next(fn(val)),
error => observer.error(error),
() => observer.complete()
)
})
}
mergeMap(fn) {
return new Observable(observer => {
return this.subscribe(
val => {
fn(val).subscribe(
val => observer.next(fn(val)),
error => observer.error(error),
() => observer.complete()
)
},
error => observer.error(error),
() => observer.complete()
)
})
}
static fromArray(array) {
return new Observable(observer => {
array.forEach(val => observer.next(val))
observer.complete()
})
}
static fromEvent(el, event) {
return new Observable(observer => {
const handler = e => observer.next(e)
el.addEventListener(event, handler)
return () => { el.removeEventListener(event, handler) }
})
}
static fromPromise(promise) {
return new Observable(observer => {
promise
.then(val => {
observer.next(val)
observer.complete()
})
.catch(e => {
observer.error(e)
})
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment