首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用从GWT jsni代码导入ECMAScript-6?

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

Stack Overflow用户
提问于 2020-04-02 13:44:27
回答 1查看 322关注 0票数 1

因此,我知道在GWT中,我可以编写纯javascript代码的JSNI代码。但是,不幸的是,如果在JSNI代码中使用ES6代码,JSNI代码就不会编译。

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

代码语言:javascript
复制
private native void jsniMethod(String jsModule) /*-{
    import(jsModule)
        .then(loadedModule => {
            doStuffWithLoadedModule(loadedModule);
        })
        .catch(err => alert(err));
}-*/;

在GWT代码中有实现这一目标的方法吗?我的意思是,我需要一个对loadedModule的引用,这样我就可以在一些jsni代码( doStuffWithLoadedModule方法实现)中使用它。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-02 21:39:03

这是做不到的。您需要将不受JSNI支持的JS特性放入某种外部JS中,或者在与JSNI兼容的旧JS中重写它们。考虑使用ScriptInjector作为一种选项,或者您的主机html页面。

对于这个特定的东西,只需要用一个函数替换箭头操作符:

代码语言:javascript
复制
private native void jsniMethod(String jsModule) /*-{
    import(jsModule)
        .then(function(loadedModule) {
            doStuffWithLoadedModule(loadedModule);
        })
        .catch(function(err) { alert(err) });
}-*/;

作为另一种选择,要使用java,可以使用JsInterop。请记住,import实际上不是一个函数调用,而是一个js关键字,尽管这仍然有效:

代码语言:javascript
复制
@JsMethod(namespace = "<window>")
public native Promise<Object> import(String jsModuleName);

然后,您可以调用它并在中传递:

代码语言:javascript
复制
private void notJsniMethod(String jsModule) {
    import(jsModule)
        .then(loadedModule -> {
            doStuffWithLoadedModule(loadedModule);
            return null;
        })
        .catch_(err -> {
            DomGlobal.alert(err.toString())
            return null;
        });

}

与原JS/JSNI相比的变化:

  • =>被java的->所取代,它操作的way
  • alert(...)现在是DomGlobal.alert(...),因为java不需要“全局的”namespace
  • explicit return null,因为Java不会让您“忘记”当值required.
  • .catch(...)替换为.catch_(...)时返回值,因为Java不允许关键字用作标识符
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60993026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档