Skip to content

Instantly share code, notes, and snippets.

@luan0ap
Created July 19, 2022 22:27
Show Gist options
  • Save luan0ap/a6abb144589e4239e65eafa6ae327cec to your computer and use it in GitHub Desktop.
Save luan0ap/a6abb144589e4239e65eafa6ae327cec to your computer and use it in GitHub Desktop.
Observable classes practical examples -- case of study
class Observable {
constructor(observer){
this._observer = observer;
}
subscribe(observer) {
return this._observer(observer)
}
}
class Observer {
#next;
#error;
#complete;
constructor ({
next = () => {},
error = () => {},
complete = () => {}
} = {
next () {},
error () {},
complete () {}
}) {
this.#next = next
this.#error = error
this.#complete = complete
}
error (err = new Error('')) {
// Default behavior on error
if (err === null) {
return this.#error(new Error())
}
if (typeof err === 'string' || typeof err === 'number') {
return this.#error(new Error(err))
}
if (err.constructor.name === 'Object' || Array.isArray(err)) {
return this.#error(new Error('', { cause: err }))
}
return this.#error(err)
}
complete () {
// Default behavior on completed
return this.#complete()
}
next (data) {
// Default behavior on success
return this.#next(data)
}
}
const myObservable = new Observable(observer => {
setTimeout(() => {
observer.next("got data!")
observer.complete()
}, 1000)
})
const myObserver = new Observer({
error (err) {
// Overwrited error behavior
console.log(err)
throw err
}
})
myObservable.subscribe(myObserver)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment