1

我正在研究这个事件发射器 javascript 问题,有人可以帮助我了解如何在不向其传递任何参数的情况下实现 release() 吗?

下面的代码应该能够根据类型将事件添加到数组中。在接受任意数量的参数时按类型触发事件,并使用引用释放(取消订阅)事件,只需调用sub.release().

这是我迄今为止实施的,我感谢任何反馈: https ://jsfiddle.net/280toksn/1/

class Emitter {
    constructor() {
        this.events = {};
    }
    
    subscribe = (type, fn) => {
        if(this.events[type] === undefined) {
            this.events[type] = [];
        }
        
        this.events[type].push(fn);
        
        return this;
    }
    
    emit = (type,...args) => {
        for(let i=0; i < this.events[type].length; i++) {
            this.events[type][i](...args);
        }
    }
    
    release = () => {
        
    }
}
4

1 回答 1

2

release方法不应该是Emitter类的实例方法,并且该subscribe方法不应该返回Emitter实例。每次调用subscribe都应返回具有该release方法的不同对象。

在 JS 中,创建一个简单的对象返回这里可能很好,但Subscription如果你愿意,你也可以创建一个单独的类。这是一个带有普通对象的示例。

此外,我将它切换为Set用于事件,因为它使事情变得更容易。

class Emitter {
    constructor() {
        this.events = {};
    }
    
    subscribe = (type, fn) => {
        if(this.events[type] === undefined) {
            this.events[type] = new Set();
        }
        
        this.events[type].add(fn);
        
        return {
            release: () => {
                this.events[type].delete(fn);
            }
        };
    }
    
    emit = (type,...args) => {
        if (this.events[type] === undefined) {
            return;
        }
        [...this.events[type]].forEach(sub => sub(...args));
    }
    
}
于 2020-06-26T17:06:18.297 回答