UNPKG

2.55 kBJavaScriptView Raw
1exports = module.exports = class Hook {
2
3 constructor () {
4 this._hooks = {};
5 }
6
7 register (key, fn) {
8 if (!this._hooks[key]) {
9 this._hooks[key] = [];
10 }
11 this._hooks[key].push(fn);
12 }
13
14 hasHook (key) {
15 return (this._hooks[key] || []).length > 0;
16 }
17
18 hook (key, ...args) {
19 let rst = [];
20 let fns = this._hooks[key] || [];
21 fns.forEach(fn => {
22 (typeof fn === 'function') && (rst.push(fn.apply(this, args)));
23 });
24 return rst;
25 }
26
27 hookSeq (key, ...args) {
28 let rst = args;
29 let hasHook = false;
30 (this._hooks[key] || []).forEach((fn, i) => {
31 if (typeof fn === 'function') {
32 hasHook = true;
33 if (fn.length > 1) {
34 rst = fn.apply(this, rst);
35 } else {
36 rst = fn.call(this, i === 0 ? rst[0] : rst);
37 }
38 }
39 });
40 return hasHook ? rst : (rst.length <= 1 ? rst[0] : rst);
41 }
42
43 hookUnique (key, ...args) {
44 let rst;
45 let hooks = this._hooks[key] || [];
46
47 let lastHook = hooks[hooks.length - 1];
48
49 if (typeof lastHook === 'function') {
50 return lastHook.apply(this, args);
51 } else {
52 return rst;
53 }
54 }
55
56 hookUniqueReturnArg (key, ...args) {
57 let rst = args;
58 let hooks = this._hooks[key] || [];
59
60 let lastHook = hooks[hooks.length - 1];
61
62 if (typeof lastHook === 'function') {
63 return lastHook.apply(this, args);
64 } else {
65 return (rst.length <= 1 ? rst[0] : rst);
66 }
67 }
68
69 hookAsyncSeq (key, ...args) {
70 let rst = args;
71 let hooks = this._hooks[key] || [];
72
73 let count = 0;
74 let allRst = [];
75 let lastRst = rst;
76 let argLength = args.length;
77
78 if (hooks.length === 0) {
79 return Promise.resolve(argLength === 1 ? args[0] : args);
80 }
81
82 return new Promise((resolve, reject) => {
83 const iterateFunc = (pfn, cfn) => {
84 return pfn.then(v => {
85 if (!Array.isArray(v)) {
86 v = [v];
87 }
88 if (count++ !== 0) {
89 allRst = allRst.concat(v);
90 }
91 lastRst = v;
92 return cfn.apply(this, lastRst);
93 }).catch(e => {
94 reject(e);
95 })
96 }
97
98 hooks = hooks.concat(() => Promise.resolve());
99 hooks.reduce(iterateFunc, Promise.resolve(args)).then(() => {
100 resolve(argLength === 1 ? lastRst[0] : lastRst);
101 });
102 });
103 }
104 hookReturnOrigin (key, ...args) {
105 let rst = [];
106 let fns = this._hooks[key] || [];
107 fns.forEach(fn => {
108 (typeof fn === 'function') && (fn.apply(this, args));
109 });
110 return args;
111 }
112}