因此,我知道在GWT中,我可以编写纯javascript代码的JSNI代码。但是,不幸的是,如果在JSNI代码中使用ES6代码,JSNI代码就不会编译。
这意味着,例如,我不能做这样的事情:
private native void jsniMethod(String jsModule) /*-{
import(jsModule)
.then(loadedModule => {
doStuffWithLoadedModule(loadedModule);
})
.catch(err => alert(err));
}-*/;在GWT代码中有实现这一目标的方法吗?我的意思是,我需要一个对loadedModule的引用,这样我就可以在一些jsni代码( doStuffWithLoadedModule方法实现)中使用它。
谢谢!
发布于 2020-04-02 21:39:03
这是做不到的。您需要将不受JSNI支持的JS特性放入某种外部JS中,或者在与JSNI兼容的旧JS中重写它们。考虑使用ScriptInjector作为一种选项,或者您的主机html页面。
对于这个特定的东西,只需要用一个函数替换箭头操作符:
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);然后,您可以调用它并在中传递:
private void notJsniMethod(String jsModule) {
import(jsModule)
.then(loadedModule -> {
doStuffWithLoadedModule(loadedModule);
return null;
})
.catch_(err -> {
DomGlobal.alert(err.toString())
return null;
});
}与原JS/JSNI相比的变化:
=>被java的->所取代,它操作的wayalert(...)现在是DomGlobal.alert(...),因为java不需要“全局的”namespacereturn null,因为Java不会让您“忘记”当值required..catch(...)替换为.catch_(...)时返回值,因为Java不允许关键字用作标识符https://stackoverflow.com/questions/60993026
复制相似问题