Skip to content

Instantly share code, notes, and snippets.

@javarouka
Last active May 24, 2017 16:19
Show Gist options
  • Save javarouka/dde2524edaa30a63276c29d889e990b8 to your computer and use it in GitHub Desktop.
Save javarouka/dde2524edaa30a63276c29d889e990b8 to your computer and use it in GitHub Desktop.
play promise post example
function deferredEventer() {
// event map.
// 이벤트들은 이름 하나당 Set 의 구조를 가진다.
const eventMap = new Map();
return new class {
/**
* 이벤트를 예약한다.
* 예약하는 이벤트는 Set 으로 저장된다
* @param name
*/
defer(name) {
if(!eventMap.has(name)) {
eventMap.set(name, new Set());
}
return new Promise(resolve => eventMap.get(name).add(resolve));
}
/**
* 첫번째 인자로 전달되는 이벤트들을 일괄 처리한다.
*
* @param name 이벤트 이름
* @param args rest 파라미터. 이벤트들의 resolving 시에 배열로 전달된다.
*/
fulfill(name, ...args) {
try {
if(!eventMap.has(name)) {
return;
}
const resolveMap = eventMap.get(name);
resolveMap.forEach(resolve => resolve(args));
}
finally {
// 한번 종료된 이벤트는 지운다.
// Promise 특성상 한번 fulfilled 되면 다시는 수행되지 않지만,
// 메모리 문제도 있고 하니...
this.cancel(name);
}
}
/**
* 해당 이름의 이벤트를 취소해버린다.
*/
cancel(name) {
eventMap.delete(name);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment