Как я могу реализовать Circuit Sandbox Client в приложении GWT с IsInterop или Babel?

Мне нужно разработать клиент Circuit Sandbox в GWT. https://unpkg.com/circuit-sdk использует ES6, поэтому я не могу использовать GWT JSNI. Я пытаюсь написать 'Пример тизера для входа в систему и получения разговоров' на https://circuit.github.io/jssdk.html. Я должен сказать, что мои знания JavaScript такие же, как у начинающих.

Я думаю, у меня есть два варианта: мой первый вариант - использовать JsInterop от GWT. (Я уже использовал это, чтобы реализовать Websocket для этого приложения GWT. Поэтому я использовал пример ' http://www.g-widgets.com/2017/03/16/example-of-using-websockets-in-gwt-with-a-spring-boot-server/', и это отлично работает.)

Для клиента Circuit я начал писать следующий класс Java:

@JsType( isNative = true, namespace = JsPackage.GLOBAL )
public class Client {
    @JsConstructor
    public Client( final String token, final String readings, final String uri ) {
    }

    @JsMethod
    public native void logon();

//  The old JSNI code (not usable here):
//  public static native void logon() /*-{
//      client.logon()
//      .then(user => console.log('Successfully authenticated as ' + user.displayName))
//      .then(client.getConversations)
//      .then(conversations => conversations.forEach(c => console.log(c.convId)))
//      .catch(console.error);
//  }-*/;
}

Этот код не может работать, потому что у меня не определен модуль javascript и метод входа не реализован.

Как я могу получить доступ к модулю javascript "Схема" и как мне реализовать метод logon()? И что еще мне нужно, чтобы этот класс JsInterop работал?

Второй вариант: я конвертировал https://circuitsandbox.net/sdk в ES5 с Babel. Я включил встроенный скрипт в свое приложение GWT и попытался реализовать метод входа в систему следующим образом:

client();

public static native void client() /*-{
    var client = new $wnd.Circuit.Client({
        client_id: '78cafde2f6854ad5ad80a67c532687bc',
        scope: 'READ_USER_PROFILE,READ_CONVERSATIONS',
        domain: 'circuitsandbox.net'
});

    client.logon().then(function (user) {
        return console.log('Logged on user:', user);
    }).catch(console.error);
}-*/;

Когда я вызываю метод, я получаю несколько ошибок:

[ERROR] Line xx: missing name after . operator

Эта ошибка происходит, потому что JSNI не может скомпилировать ES6.

Если я закомментирую метод javascript client.logon, я получу еще одну ошибку:

"TypeError: Cannot read property 'Client' of undefined"

var client = new $wnd.Circuit.$wnd.Client(...

тоже не сработает.

Кто-нибудь может сказать мне, что я должен сделать, чтобы заставить это работать, и что является лучшим решением?

Большое спасибо заранее, и я был бы очень рад, если кто-нибудь может помочь мне здесь.

1 ответ

Не потому, что Circuit использует ES6, ваш код (в JSNI) должен использовать ES6. Вы можете заменить лямбды анонимными функциями; и потому что catch является ключевым словом, вы должны передать свой метод catch в качестве второго аргумента then методы:

public static native void logon() /*-{
  client.logon()
  .then(function(user) { console.log('Successfully authenticated as ' + user.displayName); })
  .then(client.getConversations)
  .then(function(conversations) { conversations.forEach(function(c) { console.log(c.convId)); } }, console.error);
}-*/;

И аналогично с вашим вторым фрагментом.

Другие вопросы по тегам