Last active
May 24, 2017 16:19
-
-
Save javarouka/dde2524edaa30a63276c29d889e990b8 to your computer and use it in GitHub Desktop.
play promise post example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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