java - JavaScript 事件处理程序使用什么宿主对象

标签 java graalvm graaljs

我想允许 JavaScript 注册事件,语法如下

object.on('eventName', (event) => {
  event.something();
});

event 对象根据 'eventName' 的内容提供不同的方法(取决于我要为其添加处理程序的事件类型)。

我需要为objectevent创建宿主对象,我假设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/

相关文章:

java - BufferedImage 的 Changellistener

java - Google Foobar,字符串清理,测试失败 5

graalvm - 有人可以解释一下 Graal、GraalVM、Truffle 和 SubstrateVM 之间的区别吗?

java - 相当于 graal.js 脚本引擎中 Nashorn 的 importPackage

java - 是否可以在监听更改的变量上创建注释?

java - KeyListener 不工作并且映射重叠字符

java - 有没有办法使用 java 对象作为函数的参数并在 GraalJS 中返回所述对象的值之一?

javascript - Graal Javascript - 线程安全

graalvm - 捆绑 Graal VM 和其他 VM + Graal JIT 之间的区别

java - Java 11 的 Nashorn 替代品