Advertisement
Guest User

Untitled

a guest
May 24th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. function deferredEventer() {
  2.  
  3. // event map.
  4. // 이벤트들은 이름 하나당 Set 의 구조를 가진다.
  5. const eventMap = new Map();
  6.  
  7. return new class {
  8.  
  9. /**
  10. * 이벤트를 예약한다.
  11. * 예약하는 이벤트는 Set 으로 저장된다
  12. * @param name
  13. */
  14. defer(name) {
  15.  
  16. if(!eventMap.has(name)) {
  17. eventMap.set(name, new Set());
  18. }
  19.  
  20. return new Promise(resolve => eventMap.get(name).add(resolve));
  21. }
  22.  
  23. /**
  24. * 첫번째 인자로 전달되는 이벤트들을 일괄 처리한다.
  25. *
  26. * @param name 이벤트 이름
  27. * @param args rest 파라미터. 이벤트들의 resolving 시에 배열로 전달된다.
  28. */
  29. fulfill(name, ...args) {
  30.  
  31. try {
  32. if(!eventMap.has(name)) {
  33. return;
  34. }
  35.  
  36. const resolveMap = eventMap.get(name);
  37.  
  38. resolveMap.forEach(resolve => resolve(args));
  39. }
  40. finally {
  41.  
  42. // 한번 종료된 이벤트는 지운다.
  43. // Promise 특성상 한번 fulfilled 되면 다시는 수행되지 않지만,
  44. // 메모리 문제도 있고 하니...
  45. this.cancel(name);
  46. }
  47. }
  48.  
  49. /**
  50. * 해당 이름의 이벤트를 취소해버린다.
  51. */
  52. cancel(name) {
  53. eventMap.delete(name);
  54. }
  55. }
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement