Это не может быть сделано. Вам необходимо поместить 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 не разрешает использовать ключевое слово в качестве идентификатора