
Александр
07.01.2018
15:56:37
Спс

Igor
07.01.2018
15:59:02

Kylych
07.01.2018
17:53:00
привет всем, подскажите, имеется callback hell, можно ли его улучшить/избавиться с помощью корутины?
Есть один момент, который меня тормозит. У меня три вызова/роута по апи, как обычно есть порядок и зависимости друг от друга. И каждый роут может являться еще подписчиком, т.е. может подключиться к бэкенду и принимать евенты, пока юзер на этом экране.
код - https://gist.github.com/toktogul/02daa9fad59daf35eeee216ffa620187

swh
07.01.2018
17:54:28
Обязательно корутины?

Google

Kylych
07.01.2018
17:55:08
недавно посмотрел доклад на тему корутин, подумал, крутая штука
более читабельный код получается

swh
07.01.2018
17:55:28
Понял, я тут не помогу пока )

Sergey
07.01.2018
17:56:06
все события по одному разу вызываются?
или там стримы?

Kylych
07.01.2018
17:56:16
нет, стрим
чаще всего в одном роуте стримы

Quantum Harmonizer
07.01.2018
17:59:26
можно представить стрим как Channel и вызвать consumeEach.

Kylych
07.01.2018
18:03:18
ок, буду изучать, спасибо.

Roman
07.01.2018
19:18:10
В любом случае начать надо с функции конвертера addListenerForSingleValueEvent -> Channel, как ее написать можно глянуть в kotlinx-coroutines-rx например.

Igor
07.01.2018
19:42:24

Kylych
08.01.2018
03:27:02
@leukinrs , @angmarr
Ну смотрите, это sdk firebase. В ref.child(Route.MEMBERS).addChildEventListener() я подписываюсь и слушаю пока UI открыт, у него несколько ивентов, onChildAdded(), onChildRemoved(), onChildChanged(), onChildMoved, onCancelled(). На каждый ивент своя логика. Сейчас я хочу реализовать логику для onChildAdded(), в этом методе нужно сделать еще 2 дополнительных запроса на бэкенд, у которых есть порядок вызова. Они одноразовые, там подкписки нету.
Если б не подписка, а простые запросы, я б наверное смог реализовать через обычные корутины, но тут подкписка и у меня есть сложности с реализацией.

Google

Roman
08.01.2018
06:51:32
@leukinrs , @angmarr
Ну смотрите, это sdk firebase. В ref.child(Route.MEMBERS).addChildEventListener() я подписываюсь и слушаю пока UI открыт, у него несколько ивентов, onChildAdded(), onChildRemoved(), onChildChanged(), onChildMoved, onCancelled(). На каждый ивент своя логика. Сейчас я хочу реализовать логику для onChildAdded(), в этом методе нужно сделать еще 2 дополнительных запроса на бэкенд, у которых есть порядок вызова. Они одноразовые, там подкписки нету.
Если б не подписка, а простые запросы, я б наверное смог реализовать через обычные корутины, но тут подкписка и у меня есть сложности с реализацией.
А, ну тогда примерно понятно. Набросал вариант в ответет на гист. Функции asChannel() и await() думаю разберешься как написать. Там все довольно просто и есть куча примеров.

Kylych
08.01.2018
07:09:22

swh
08.01.2018
07:15:07
Скиньте ссылку хоть :)

Kylych
08.01.2018
07:17:41

Гадкий
08.01.2018
07:25:55
А для Firebase Firestore такое никто не делал?

swh
08.01.2018
07:30:34
спасибо

Igor
08.01.2018
08:30:42

Roman
08.01.2018
08:37:07
Ну я думаю сам по себе он не вызовется.
Надо почитать доки.
Судя по докам этот метод должен называться onError
В случае канала туда надо сделать специальный Event.Error(), а в случае suspend fun await() она просто должна бросать исключение.
Хотя в канале можно сделать и иначе: передать исключение как аргумент в continuation.cancel(throwable)
Реализация зависит от логики самой апи. Если после onCancel еще будут события, то надо взять первый вариант, а если onCancel - последнее событие в потоке, то второй.

Igor
08.01.2018
09:37:28
А есть какой-нибудь экстеншен для junit, что бы можно было suspened тесты писать?

Roman
08.01.2018
09:42:06
Дык, runBlocking(Unconfined) и вперед!

Igor
08.01.2018
09:44:42
А ели и это лень делать. Никто написать не хочет для junit5 ?

Roman
08.01.2018
09:46:04
Ты хочешь писать suspend fun testSomeFoo()?
Не думаю что это вообще как-то возможно. В любом случае без глубогого патчинга junit это не сделать (могу наврать, потому как в кишках junit не ковырялся).

Руслан
08.01.2018
12:10:42
А вы знали что в Kotlin/JS используется часть GWT? https://sdcast.ksdaemon.ru/2017/10/sdcast-64/#comment-3645770433

Igor
08.01.2018
12:18:26
> У защитника Дарта какая-то травма оставленная TypeScript'ом: хочется сравнивать дарт с более успешным TS и говорить как в дарте все лучше, а TS это как JS ?
Хм, вроде бы “не защитник дарта”, но после попыток юзать TS, травмирован на столько,
что больше не могу терпеть языки “расширяющие жс” (Flow/TS).
(это же такое же г, только с типами ?)

Google

Руслан
08.01.2018
12:27:19

Igor
08.01.2018
13:10:30
Хм это вопрос (риторический вопрос) или утверждение?
С последним утверждением согласен, я правда под android пишу))) тк что не сильно в этом шарю.

Sergey
08.01.2018
13:11:21
меня пока Kotlin/js немного ужасает. как-то много телодвижений нужно делать чтобы заюзать какой-нибудь jquery

Igor
08.01.2018
13:12:09
> 2018
> jquery
?

Sergey
08.01.2018
13:12:17
я образно)

Igor
08.01.2018
13:12:40
Ну вроде React из коробки поддерживается. Что еще для счастья надо?

Руслан
08.01.2018
13:18:41
Свой frontend фреймворк
С имплементациями поверх javafx/react/android?

Sergey
08.01.2018
13:22:10
а gradle на фронт обязательно тащить?

Руслан
08.01.2018
13:22:40
если отказаться от готовых js библиотек, т.е. npm не нужен, то почему нет?

Igor
08.01.2018
13:27:07

Pavel
08.01.2018
13:28:52

Руслан
08.01.2018
13:29:24

Sergey
08.01.2018
13:30:05
наши вроде как заинтересовались котлином, но вот когда начали щупать и пришлось ставить дикий для них gradle с этим убогим groovy, и еще пляски вокруг экосистемы жса чтобы пользоваться ей, то интерес как-то сразу поутих
мне в принципе пофиг, я на фронт не лезу)

Pavel
08.01.2018
13:32:16
когда после scala я посмотрел на kotlin... я еле свог найти 10 отличий

Sergey
08.01.2018
13:32:19
на досуге хочу поиграться и пописать экстешены к пхп на kotlin/native

Pavel
08.01.2018
13:32:46

Google

Sergey
08.01.2018
13:32:58
как сказать похожи..

Quantum Harmonizer
08.01.2018
13:33:00

Igor
08.01.2018
13:33:04
1) Можно же писать на React + Kotlin и делать ProgressiveWebApplication, которые могут работать без интернета.
2) Либо писать на ReactNative + Kotlin и компилить в android/ios/macos/windows
3) Либо писать на ReactNative и компилить в html5 ? и дальше см п1 c PWA ( https://github.com/necolas/react-native-web )

Sergey
08.01.2018
13:33:34
по-немногу переходим

Grigory
08.01.2018
13:33:55
вопрос был скорее зачем котлин если есть пхп

Sergey
08.01.2018
13:34:10

Pavel
08.01.2018
13:34:11

Admin
ERROR: S client not available

Sergey
08.01.2018
13:34:12
?

Pavel
08.01.2018
13:34:28

Quantum Harmonizer
08.01.2018
13:34:34

Sergey
08.01.2018
13:34:58
сила груви в билд скриптах, как Барух завещал

Igor
08.01.2018
13:35:11

Sergey
08.01.2018
13:35:21
подглядывает)

Grigory
08.01.2018
13:35:54

Sergey
08.01.2018
13:36:26

Grigory
08.01.2018
13:37:59
не буду набарсывать стикеров, но тут именно большая кривая рожа.
------------
да никто не спорит на самом деле, что пхппистов (и гоферов) много, это же уже бизнес вопрос и его все рашают по своему

Sergey
08.01.2018
13:38:18
ладно не будем языковой срач разводить

Google

Sergey
08.01.2018
13:38:44
да у нас на проекте и пхп(в приоритете), и котлин, и даже есть немного дотнета под моно
но двигаемся в сторону котлина

Руслан
08.01.2018
13:38:45
это в @jvmchat, там все эксперты)

Grigory
08.01.2018
13:38:47
я вроде и сгладил возможный срач) ну попытался

Pavel ?
08.01.2018
13:48:03

Igor
08.01.2018
13:48:11

Sergey
08.01.2018
13:48:31

Boris
08.01.2018
13:49:41

Igor
08.01.2018
13:51:13
Тут и джава подтягивается со своим final var ?♂️ (конкуренция усиливается)))

Boris
08.01.2018
13:51:43
Нельзя просто так взять и заставить людей писать коротко, они же не поймут

Руслан
08.01.2018
13:54:17
Люди разные бывают, кто-то не хочет писать типы после имени (name: Type), кто-то хочет писать типы (видеть хотя бы). Поэтому надеятся что все-все перейдут на то что кажется более правильным и красивым не стоит :)

Konstantin
08.01.2018
14:05:33
Ну типы еще фигня и дело привычки, даже если не все признают, но вот final var как-то уже за гранью.

Sasha
08.01.2018
14:17:07

Руслан
08.01.2018
14:21:27
Ну вот пишем же const val :) редко конечно, но глаз не режет

Sasha
08.01.2018
14:25:30

nikita
08.01.2018
14:37:22
подскажите, можно что-то сделать с Jackson'ом, чтобы для data-классов начал сериализоваться их тип в проперти @class?
если создаю
open class SomeData {...}
и потом пишу
ObjectMapper()
.registerModule(KotlinModule())
.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)
.writeValueAsString(SomeData())
то все нормально, получаю json:
{"@class":"....SomeData",....}
а для data-классов не работает.

Руслан
08.01.2018
14:39:52
data class - FINAL

nikita
08.01.2018
14:40:10
да я догадываюсь ?
сделать-то можно что-нибудь?

Руслан
08.01.2018
14:40:36
а зачем класс записывать

nikita
08.01.2018
14:40:39
с джексоном, не с котлином ?