Skip to content

Instantly share code, notes, and snippets.

@hoodwink73
Created October 5, 2019 06:58
Show Gist options
  • Save hoodwink73/c6ddda4d167a02cf54d10a9106fe81ce to your computer and use it in GitHub Desktop.
Save hoodwink73/c6ddda4d167a02cf54d10a9106fe81ce to your computer and use it in GitHub Desktop.
This a simple demonstration of what is an observable –– just an object with a subscribe(forEach) method
function Observable(forEach) {
this._forEach = forEach;
}
Observable.prototype = {
forEach: function(onNext, onError, onCompleted) {
if (typeof onNext === "function") {
this._forEach({
onNext: onNext,
onError: onError || function() {},
onCompleted: onCompleted || function() {}
});
} else {
// onNext is {onNext: () => {}, onError: (), ...}
return this._forEach(onNext);
}
},
map: function(projectionFunction) {
var self = this;
return new Observable(function forEach(observer) {
return self.forEach({
onNext: x => {
observer.onNext(projectionFunction(x));
},
onError: e => observer.onError(e),
onCompleted: () => observer.onCompleted()
});
});
},
filter: function(testFunction) {
var self = this;
return new Observable(function forEach(observer) {
return self.forEach({
onNext: x => {
if (testFunction(x)) {
return observer.onNext(x);
}
},
onError: e => observer.onError(e),
onCompleted: () => observer.onCompleted()
});
});
},
take: function(num) {
var self = this;
var counter = 0;
return new Observable(function forEach(observer) {
var subscription = self.forEach({
onNext: x => {
observer.onNext(x);
counter++;
if (counter > num) {
subscription.dispose();
observer.onCompleted();
}
},
onError: e => observer.onError(e),
onCompleted: () => observer.onCompleted()
});
return subscription;
});
}
};
Observable.fromEvent = function(dom, eventName) {
return new Observable(function forEach(observer) {
var handler = e => observer.onNext(e);
dom.addEventListener(eventName, handler);
return {
dispose: () => {
dom.removeEventListener(eventName, handler);
}
};
});
};
const button = document.getElementById("button");
Observable.fromEvent(button, "click")
.filter(e => e.pageX > 20)
.map(e => e.pageX + "px")
.forEach({
onNext: e => console.log(e)
});
@hoodwink73
Copy link
Author

Play on codesandbox

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment