1 | exports = 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 | }
|