Как я могу реализовать 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);
}-*/;
И аналогично с вашим вторым фрагментом.