Skip to content

Instantly share code, notes, and snippets.

@manuelxaguilar
Last active December 5, 2016 17:05
Show Gist options
  • Save manuelxaguilar/df4ff189f2d02dbb2caba3e50abeec8a to your computer and use it in GitHub Desktop.
Save manuelxaguilar/df4ff189f2d02dbb2caba3e50abeec8a to your computer and use it in GitHub Desktop.
Creating an observable ES2015 class to better understand how reactive programming works.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input id="input" />
<script src="observable.js"></script>
</body>
</html>
// Creating an observable ES2015 class to better understand
// how reactive programming works.
// This is a WIP
class Observable {
constructor(subscribe) {
this._subscribe = subscribe
}
subscribe(onNext, onError = () => {}, onCompleted = () => {}) {
if (typeof onNext === 'function') {
return this._subscribe({
onNext,
onError,
onCompleted
})
}
return this._subscribe(onNext)
}
map(projectionFunction) {
return new Observable(observer =>
this.subscribe(e =>
observer.onNext(projectionFunction(e))
)
)
}
filter(predicateFunction) {
return new Observable(observer => {
this.subscribe(e => {
if (predicateFunction(e)) observer.onNext(e)
})
})
}
take(num) {
return new Observable(observer => {
let counter = 0;
const subscription = this.subscribe(e => {
observer.onNext(e)
counter++
if (counter === num) {
observer.onCompleted()
subscription.dispose()
}
})
})
}
}
Observable.fromEvent = (dom, event) => {
return new Observable(observer => {
const handler = e => observer.onNext(e)
dom.addEventListener(event, handler)
return () => {
console.log('disposed')
dom.removeEventListener(event, handler)
}
})
}
Observable.fromObservations = (obj) => {
return new Observable(observer => {
const handler = e => observer.onNext(e)
Object.observe(obj, handler)
return () => {
console.log('disposed')
Object.unobserve(obj, handler)
}
})
}
const keyPresses = Observable
.fromEvent(document.getElementById('input'), 'keypress')
.map(eventPassedOver => eventPassedOver.key)
keyPresses.subscribe(x => console.log(x))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment