Skip to content

Instantly share code, notes, and snippets.

@burdiuz
Created March 10, 2017 21:10
Show Gist options
  • Save burdiuz/fc54775c907422386fbcad2cf701ab0d to your computer and use it in GitHub Desktop.
Save burdiuz/fc54775c907422386fbcad2cf701ab0d to your computer and use it in GitHub Desktop.
Promise listener for an event that will resolve when event fired
import SymbolImpl from 'SymbolImpl';
const INTERNALS_FIELD = SymbolImpl('event.deferred::internals');
class EventDeferred {
constructor(dispatcher, eventType) {
this.promise = new Promise((resolve, reject) => {
this[INTERNALS_FIELD] = {
dispatcher,
eventType,
resolve,
reject,
handler: (event) => {
const { resolve } = this[INTERNALS_FIELD];
this.cancel();
resolve(event);
},
};
});
dispatcher.addEventListener(eventType, this[INTERNALS_FIELD].handler);
}
get dispatcher() {
return this[INTERNALS_FIELD].dispatcher;
}
get eventType() {
return this[INTERNALS_FIELD].eventType;
}
get listening() {
return !this[INTERNALS_FIELD].resolve;
}
cancel = () => {
const { dispatcher, eventType, handler } = this[INTERNALS_FIELD];
dispatcher.removeEventListener(eventType, handler);
delete this[INTERNALS_FIELD].resolve;
};
reject = (data = null) => {
const { reject } = this[INTERNALS_FIELD];
this.cancel();
reject(data);
};
dispose = () => {
delete this[INTERNALS_FIELD];
};
}
export default EventDeferred;
{
"name": "EventDeferred",
"description": "Promise listener for an event that will resolve when event fired",
"version": "0.0.1",
"main": "EventDeferred.js",
"dependencies": {
"SymbolImpl": "https://gist.github.com/burdiuz/7664491eed84695250e46be20670be84"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment