我想允许 JavaScript 注册事件,语法如下
object.on('eventName', (event) => {
event.something();
});
event
对象根据 'eventName'
的内容提供不同的方法(取决于我要为其添加处理程序的事件类型)。
我需要为object
和event
创建宿主对象,我假设object
所需的类必须查看类似的东西
public class Events {
public void on(String eventName, X<FirstEvent> event) {
// ...
}
public void on(String eventName, X<SecondEvent> event) {
// ...
}
}
如果有两种类型的事件。
但我不知道如何让 graalvm 自动选择正确的 on
方法,并且我不知道第二个参数使用什么类型(它必须是 JavaScript 匿名)函数接受某种类型的单个参数,并且稍后必须可以由我的 Java 代码运行)。
如何存储 JavaScript 匿名函数
(event) => {
event.something();
}
作为某种 Java Runnable,并确保 GraalVM 知道根据第一个字符串参数的值使用哪个 on
方法(因为传递的 event
对象将不同的事件有所不同)。
我认为这可能是一个 super 复杂的问题,我发现很难正确表达。
我想为 JavaScript 创建一种方法来注册事件处理程序,这些事件处理程序是稍后使用某些参数调用的函数。
最佳答案
我不确定这是否是问题所在,但我希望这会有所帮助。
为了使此代码片段正常工作:
object.on('eventName', (event) => {
event.something();
});
可用于互操作性目的的最简单的 Java 类:
public class MyJavaClass {
public void on(String type, Consumer<Object> handler) {
}
}
然后你可以在 JavaScript 中使用 if ,例如:
const myJavaClassType = Java.type('MyJavaClass')
var object = new myJavaClassType();
object.on('X', (event) => { console.log(event) })
这会起作用,并且方法 .on()
将运行,并且您可以存储处理程序
以供稍后调用。
在 Java 中,不存在基于参数值的方法重载。因此,如果您想根据 eventName
的值调用特定的处理程序,您需要自己编写。
也许是这样的:
public class MyJavaClass {
private Map<String, Consumer<Object>> handlers = new HashMap<>();
public void fire(String type, Object event) {
Consumer<Object> handler = handlers.get(type);
if(handler != null) {
handler.accept(event);
}
}
public void on(String type, Consumer<Object> handler) {
handlers.put(type, handler);
}
关于java - JavaScript 事件处理程序使用什么宿主对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54503584/