Как вызвать функцию 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 очень плохи.

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


person Robert Maier    schedule 29.08.2017    source источник
comment
@EJoshuaS, потому что GWT компилирует Java в сопоставимый JS, и именно об этом вопрос.   -  person Colin Alworth    schedule 29.08.2017
comment
Можете ли вы уточнить, что такое возвращаемое значение? это обещание, которое вы будете использовать в своем Java-коде? или вы просто вызовете startLogon() в Java, а затем закончите?   -  person Colin Alworth    schedule 29.08.2017


Ответы (1)


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

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

Это сработает, хотя вы ничего не сможете сделать с возвращенным промисом. Если вы хотите использовать возвращенное обещание, я рекомендую добавить elemental2 и вместо этого использовать Promise startLogon(), чтобы вы могли использовать его следующим образом:

startLogon().then(
    success -> { console.log("success", success); return null; },
    failure -> { console.log("failure", failure); return null; });
person Ignacio Baca    schedule 30.08.2017