heyujie
2021-05-20 6ebdefb4a5b2be82a8c452c0bb4624f3d85a17b7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
export default new class {
    constructor() {
        this.listeners = new Map();
    }
 
    addListener(label, callback, vm) {
        if (typeof callback === 'function') {
            this.listeners.has(label) || this.listeners.set(label, []);
            this.listeners.get(label).push({callback: callback, vm: vm});
 
            return true;
        }
 
        return false;
    }
 
    removeListener(label, callback, vm) {
        let listeners = this.listeners.get(label),
            index;
 
        if (listeners && listeners.length) {
            index = listeners.reduce((i, listener, index) => {
                return (typeof listener.callback === 'function' && listener.callback === callback && listener.vm === vm) ?
                    i = index :
                    i;
            }, -1);
 
            if (index > -1) {
                listeners.splice(index, 1);
                this.listeners.set(label, listeners);
                return true;
            }
        }
        return false;
    }
 
    emit(label, ...args) {
        let ret = false;
        this.listeners.forEach((listeners, key) => {
            if (this.eq(label, key) && listeners && listeners.length) {
                listeners.forEach((listener) => {
                    listener.callback.call(listener.vm, ...args, label);
                });
                ret = true;
            }
        });
        return ret;
    }
 
    eq(str1, str2) {
        let arr1 = str1.split('/');
        let arr2 = str2.split('/');
        if (!str1.includes('#') && !str2.includes('#') && arr1.length !== arr2.length) {
            return false;
        }
        if (arr2.length < arr1.length) {
            arr2 = str1.split('/');
            arr1 = str2.split('/');
        }
        let ret = true;
        arr1.forEach((val, i) => {
            if (val === '+' || val === '#'
                || (arr2[i] && arr2[i] === '+')
                || (arr2[i] && arr2[i] === '#')
                || (arr2[i] && arr2[i] === val)) {
                return;
            }
            ret = false;
        })
        return ret;
    }
 
}