Skip to content

Instantly share code, notes, and snippets.

@Olgagr
Created August 28, 2016 06:18
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 Olgagr/fd1181b51f5b0c834019c87f5d695afb to your computer and use it in GitHub Desktop.
Save Olgagr/fd1181b51f5b0c834019c87f5d695afb to your computer and use it in GitHub Desktop.
Defining observable from scratch
/**************************
Observable from scratch
***************************/
function Observable(subscribe) {
this._subscribe = subscribe;
}
Observable.prototype.subscribe = function subscribe() {
if (typeof arguments[0] === "function") {
return this._subscribe({
next: arguments[0],
error: arguments[1],
complete: arguments[2]
});
} else {
this._subscribe(arguments[0]);
}
};
Observable.prototype.map = function map(projectionFunction) {
var self = this;
return new Observable(function(observer) {
return self._subscribe({
next: (x) => observer.next(projectionFunction(x)),
error: (err) => observer.error(err),
complete: () => observer.complete()
});
});
};
Observable.prototype.filter = function filter(predictableFunction) {
var self = this;
return new Observable(function(observer) {
self._subscribe({
next: (x) => {
if (predictableFunction(x)) {
observer.next(x);
}
},
error: (err) => observer.error(err),
complete: () => observer.complete()
})
});
};
// fromEvent -> Observable.fromEvent(dom, eventType)
Observable.fromEvent = function(dom, eventName) {
return new Observable(function(observer) {
var handler = (e) => observer.next(e);
dom.addEventListener(eventName, handler);
// subscription object
return {
unsubscribe: () => {
dom.removeEventListener(eventName, handler);
}
};
});
};
var button = document.querySelector('#btn');
var o = Observable.fromEvent(button, 'click')
.map((e) => e.type);
o.subscribe({
next: (e) => console.log(e),
error: () => {},
complete: () => console.log('done')
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment