自定义防止 NodeJS 中的默认值

Custom prevent default in NodeJS

在JavaScript中,处理事件时可以调用event.preventDefault(),这将阻止事件的默认操作。在 NodeJS 中,这会将 event.defaultPrevented 设置为 true。我希望能够在我的 class 中创建自定义发射器,如果未调用 event.preventDefault(),它将默认执行诸如关闭应用程序之类的操作。问题是,发射器似乎没有办法检查 preventDefault() 是否已被调用,因为 defaultPrevented 是事件的 属性 而不是发射器,因此无法被读取发射器。

这是一些示例代码

class MyClass extends EventEmitter{
    close(winID:number):void{
        this.emmit('will-quit');
        app.close(winID);
    }
}

如果 will-quit 的侦听器调用 preventDefault,我想阻止调用 app.close()。

我有一个关于如何检查是否已调用 preventDefault 的想法,但它非常笨拙,可能不是最好的想法。

class MyClass extends EventEmitter{
    close(winID:number):void{
        this.once('will-quit', (event) => {
            if (!event.defaultPrevented){
                app.close(winID);
            };
        };
        this.emit('will-quit');
    }
}

有了这个,就在事件触发之前创建了一个监听器,因此它应该是最后一个被调用的。当它被调用时,它会检查是否已调用 preventDefault 以及是否未调用所需的代码。因为它一用就一调用就销毁

我在想应该有更好的方法来做到这一点,但我在任何文档或教程中都找不到任何东西,所以我想知道这是否可能。但是基于同样的思想,像 Electron 这样的框架似乎通过使用 C++ 模块来实现这一点。

注意:所有代码示例均使用 TypeScript 编写

The issue is, there doesn't seem to be a way for the emitter to check if preventDefault() has been called as defaultPrevented is a property of the event not the emitter and as such can't be read by the emitter.

您根本没有发出事件对象,所以没有方法也没有 属性。但是,您可以通过创建这样一个对象轻松地模拟 DOM dispatchEvent method

class MyClass extends EventEmitter{
    close(winID:number): void {
        const event = {
            defaultPrevented: false,
            preventDefault(): void {
                this.defautPrevented = true;
            },
        };
        this.emit('will-quit', event);
        if (!event.defaultPrevented) {
            app.close(winID);
        }
    }
}

无需自己安装事件监听器。