какой хост-объект использовать для обработчиков событий javascript - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу разрешить 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 для регистрации событияобработчики, которые являются функциями, которые будут вызываться позднее с определенными аргументами.

1 Ответ

0 голосов
/ 08 февраля 2019

Я не уверен на 100%, если это то, что задает вопрос, но я надеюсь, что это поможет.

Чтобы этот фрагмент работал:

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

Простейший класс Java, который будет работать для целей взаимодействия:

public class MyJavaClass { 
  public void on(String type, Consumer<Object> handler) {
  }
}

Тогда вы можете использовать, если изJavaScript вроде:

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);
  }
...