Как вызвать функцию JavaScript из GWT с помощью jsInterop?

Я попробовал примеры в документе https://docs.google.com/document/d/10fmlEYIHcyead_4R1S5wKGs1t2I7Fnp_PaNaa7XTEk0/edit в разделе @JsFunction, но это дает только идеи для вызова функции java из javascript.

У меня есть файл JavaScript, включенный в мое приложение GWT со следующим кодом:

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. Я попробовал два следующих примера без какого-либо успеха:

Реализовать функцию обратного вызова Javascript с помощью GWT JsInterop

JsInterop, упаковывающий свойство функции javascript

Я должен сказать, что мои знания JavaScript очень плохи.

Может кто-нибудь дать мне пример кода? Спасибо заранее!

1 ответ

Добавьте этот статический метод в любой класс.

@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();
Другие вопросы по тегам