0

我想允许 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传递的对象对于不同的事件会有所不同)。

我认为这可能是一个超级复杂的问题,我发现正确措辞很棘手。

我想为 JavaScript 创建一种方法来注册事件处理程序,这些事件处理程序是稍后将使用某些参数调用的函数。

4

1 回答 1

1

我不是 100% 确定这是否是问题所在,但我希望这会有所帮助。

为了使此代码段起作用:

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()将运行,您可以存储handler稍后调用。

在 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);
  }
于 2019-02-08T09:10:39.557 回答