Как использовать импорт ECMAScript-6 из кода GWT jsni? - PullRequest
1 голос
/ 02 апреля 2020

Итак, я знаю, что в GWT я могу написать код JSNI, который является просто javascript кодом. Но, к сожалению, код JSNI не компилируется, если я использую в нем код ES6.

Это означает, что, например, я не могу делать такие вещи:

private native void jsniMethod(String jsModule) /*-{
    import(jsModule)
        .then(loadedModule => {
            doStuffWithLoadedModule(loadedModule);
        })
        .catch(err => alert(err));
}-*/;

Есть ли способ достичь этого в коде GWT? Я имею в виду, мне нужна ссылка на загруженный модуль, чтобы я мог использовать его в некотором коде jsni (реализация метода doStuffWithLoadedModule).

Спасибо!

1 Ответ

4 голосов
/ 03 апреля 2020

Это не может быть сделано. Вам необходимо поместить JS функции, которые не поддерживаются из JSNI, во внешний вид JS или переписать их в более старый JS, который совместим с JSNI. Рассматривайте ScriptInjector как одну из опций для этого или страницу вашего хоста html.

Для этой конкретной вещи c вам просто нужно заменить оператор стрелки на функцию:

private native void jsniMethod(String jsModule) /*-{
    import(jsModule)
        .then(function(loadedModule) {
            doStuffWithLoadedModule(loadedModule);
        })
        .catch(function(err) { alert(err) });
}-*/;

В качестве альтернативы, для использования java лямбд, вы можете использовать JsInterop. Имейте в виду, что import на самом деле не вызов функции, а ключевое слово js, хотя это все равно должно работать:

@JsMethod(namespace = "<window>")
public native Promise<Object> import(String jsModuleName);

Затем вы можете вызвать это и передать Java лямбда-выражения :

private void notJsniMethod(String jsModule) {
    import(jsModule)
        .then(loadedModule -> {
            doStuffWithLoadedModule(loadedModule);
            return null;
        })
        .catch_(err -> {
            DomGlobal.alert(err.toString())
            return null;
        });

}

Отличается от оригинального JS / JSNI:

  • => заменен на java '->, который работает почти так же, как
  • alert(...) теперь DomGlobal.alert(...), поскольку java не имеет "глобального" пространства имен
  • требуется явное return null, поскольку java не позволяет вам просто " забудьте "возвращать значение, когда оно требуется.
  • .catch(...) заменяется на .catch_(...), поскольку Java не разрешает использовать ключевое слово в качестве идентификатора
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...