Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement