Skip to content

Instantly share code, notes, and snippets.

@matthewp
Last active June 24, 2021 16:04
Show Gist options
  • Save matthewp/ad8d4b4a1ac0abb76d223f54e84c21c7 to your computer and use it in GitHub Desktop.
Save matthewp/ad8d4b4a1ac0abb76d223f54e84c21c7 to your computer and use it in GitHub Desktop.
Event observable
function listen(fn) {
const gen = fn();
function listener(ev) {
let { done } = gen.next(ev);
if(done) {
this.removeEventListener(ev.type, listener);
gen.return();
}
}
return { listener };
}
const subscription = listen(function*() {
let event;
while(event = yield) {
console.log('An event!', event);
}
});
const el = document.querySelector('#btn');
el.addEventListener('click', subscription.listener);
const obs = observable();
obs.subscribe(function*() {
let event;
while(event = yield) {
console.log('An event!', event);
}
});
const el = document.querySelector('#btn');
el.addEventListener('click', obs.listener);
// Implementation
function observable() {
let observers = [];
function subscribe(fn) {
observers.push(fn());
}
function listener(ev) {
for(let i = 0; i < observers.length; i++) {
let gen = observers[i];
let { done } = gen.next(ev);
if(done) {
gen.return();
observers.splice(i, 1);
i--;
}
}
if(observers.length === 0) {
this.removeEventListener(ev.type, listener);
}
}
return { listener, subscribe };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment