gpt4 book ai didi

ecmascript-6 - 如何使用 ECMAScript-6 从 GWT jsni 代码导入?

转载 作者:行者123 更新时间:2023-12-02 19:36:27 27 4
gpt4 key购买 nike

所以,我知道在 GWT 中我可以编写纯 javascript 代码的 JSNI 代码。但是,不幸的是,如果我在其中使用 ES6 代码,JSNI 代码将无法编译。

这意味着,例如,我不能做这样的事情:

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

有没有办法在 GWT 代码中实现这一点?我的意思是,我需要对 loadModule 的引用,以便我可以在一些 jsni 代码中使用它(doStuffWithLoadedModule 方法实现)。

谢谢!

最佳答案

这是不可能的。您需要将 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 lambda,您可以使用 JsInterop。请记住import实际上不是函数调用,而是 js 关键字,尽管这应该仍然有效:

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

然后,您可以调用它并传入 Java lambda:

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 不允许将关键字用作标识符

关于ecmascript-6 - 如何使用 ECMAScript-6 从 GWT jsni 代码导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60993026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com