如何使用jsInterop从GWT调用JavaScript函数?

时间:2017-08-29 15:26:26

标签: javascript gwt gwt-jsinterop

我尝试了文档https://docs.google.com/document/d/10fmlEYIHcyead_4R1S5wKGs1t2I7Fnp_PaNaa7XTEk0/edit#中的示例 在@JsFunction部分,但它只给出了从javascript调用java函数的想法。

我的GWT应用程序中包含一个javascript文件,代码如下:

var client = new Circuit.Client({
    client_id: '78cafde2f6854ad5ad80a67c532687bc',
    scope: 'READ_USER_PROFILE,READ_CONVERSATIONS',
    domain: 'circuitsandbox.net'
});

function startLogon() {
    client.logon()
      .then(user => console.log('Logged on as ' + user.displayName))
      .then(client.addEventListener('itemAdded', item => console.log('itemAdded event received:', item)))
      .then(client.getConversations)
      .then(conversations => {
         console.log('Retrieved ' + conversations.length + ' conversations');
    return client.addTextItem(conversations[0].convId, 'Hello World');
       })
      .then(item => console.log('Msg sent on ' + (new Date(item.creationTime)).toString()))
      .catch(console.error);
}

现在我想调用函数' startLogon()' - 我使用包装器 - 使用jsInterop注释从我的应用程序。我尝试了以下两个例子但没有取得任何成功:

Implement Javascript Function Callback with GWT JsInterop

JsInterop wrapping a javascript function property

我不得不说,我的JavaScript知识非常糟糕。

有人可以给我一个代码示例吗? 非常感谢提前!

1 个答案:

答案 0 :(得分:5)

将此静态方法添加到任何类。

@JsMethod(namespace = GLOBAL)
public static native void startLogon();

虽然您无法对返回的承诺执行任何操作,但这将有效。如果您想使用返回的承诺,我建议添加elemental2并改为使用Promise startLogon()

例如。像这样并更改js代码以返回承诺:

@Override
public boolean error(Request request, Throwable throwable) {
    Promise<String> promise = startLogon();
    promise.then(s -> {
      logger.info("Refreshed token: " + s);
      return null;
    }).catch_(error -> {
      logger.severe("Refresh Error: " + error.toString());
      return null;
    });
  return false;
}


@JsMethod(namespace = GLOBAL)
public static native Promise<String> startLogon();