Size: a a a

Kotlin Community

2020 July 07

EP

Eugene P. in Kotlin Community
Alexander Nozik
А я не про Flow. Flow - это только маленькая часть корутин
Спасибо за мнение. Пока поверю на слово. Со временем, вероятно, проникнусь идеологией
источник

EP

Eugene P. in Kotlin Community
так было и с Rx
источник

EP

Eugene P. in Kotlin Community
Кушал через немогу, а потом понравилось
источник

AM

Andrew Mikhaylov in Kotlin Community
Alexander Nozik
Просто в корутинах для передачи единственного сообщения не надо использовать Flow вообще. Это закидон RX, от которого надо отказываться. Используйте Deferred + select
А где вы единственное сообщение увидели? Оператор принимает три потока данных на вход и публикует целиком один из них на выход.
источник

AN

Alexander Nozik in Kotlin Community
Andrew Mikhaylov
А где вы единственное сообщение увидели? Оператор принимает три потока данных на вход и публикует целиком один из них на выход.
Он сказал, что ждем единственного сообщения и все закрываем.
источник

AM

Andrew Mikhaylov in Kotlin Community
Eugene P.
Обыскался, как сделать аналог Rx оператора amb на flow? Нашел, как сделать в корутинах (с помощью select). Но можно ли это адаптировать для flow как-то?
select-ом под капотом это почти наверняка и делается. Создаёте сразу флоу-результат, дожидаетесь селектом первого сообщения, а дальше публикуете в ваш флоу первое сообщение, которое дождались, и все остальные.

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

AN

Alexander Nozik in Kotlin Community
Если бы на выходе был бы Flow, то это другая ситуация, можно делать merge + debounce
источник

AM

Andrew Mikhaylov in Kotlin Community
Alexander Nozik
Он сказал, что ждем единственного сообщения и все закрываем.
Так вы на marble-диаграмму посмотрите :) Ждём-то первого сообщения, да, а потом публикуем весь флоу, откуда это сообщение пришло, забив на остальные входы.
источник

EP

Eugene P. in Kotlin Community
Alexander Nozik
Если бы на выходе был бы Flow, то это другая ситуация, можно делать merge + debounce
На выходе Flow, это выплывает из диаграммы Rx
источник

AN

Alexander Nozik in Kotlin Community
Eugene P.
На выходе Flow, это выплывает из диаграммы Rx
С одним элементом?
источник

EP

Eugene P. in Kotlin Community
Alexander Nozik
С одним элементом?
Не обязательно
источник

AN

Alexander Nozik in Kotlin Community
А, ну тогда другой вопрос. Тогда к чему было про закрытие?
источник

EP

Eugene P. in Kotlin Community
Закрыть нужно те flow, которые не выиграли
источник

EP

Eugene P. in Kotlin Community
ведь значения от них уже не актуальны
источник

EP

Eugene P. in Kotlin Community
Andrew Mikhaylov
select-ом под капотом это почти наверняка и делается. Создаёте сразу флоу-результат, дожидаетесь селектом первого сообщения, а дальше публикуете в ваш флоу первое сообщение, которое дождались, и все остальные.

Я не у машины, попробуйте сами поупражняться, нет -- попробую помочь позже с реализацией.
Спасибо, я буду пробовать. Но пока опыта маловато
источник

AN

Alexander Nozik in Kotlin Community
Не фига не понял, ну да ладно. Новые операторы добавляются легко. Можно сделать оператор на том же самом селекте
источник

AM

Andrew Mikhaylov in Kotlin Community
Eugene P.
Закрыть нужно те flow, которые не выиграли
Будете искать закрытие -- флоу отменять можно, вам, скорее всего, именно отмена и нужна. Но сначала хотя бы без отмены сделать надо.
источник

EP

Eugene P. in Kotlin Community
Alexander Nozik
Не фига не понял, ну да ладно. Новые операторы добавляются легко. Можно сделать оператор на том же самом селекте
Грубо говоря, хочется нечто такого
       fun testFlow(name: String, timeout: Long): Flow<Int> = flow {
           for (i in 1..3) {
               delay(timeout)
               println("Emitting $i from ${name}")
               emit(i)
           }
       }

       Flow.amb(
               testFlow("First", 60),
               testFlow("Second", 50),
               testFlow("Third", 70))
              .collect { println("Received ${it}") }

чтобы вывело
Emitting 1 from Second
Received 1
Emitting 2 from Second
Received 2
Emitting 3 from Second
Received 3
источник

AN

Alexander Nozik in Kotlin Community
Eugene P.
Грубо говоря, хочется нечто такого
       fun testFlow(name: String, timeout: Long): Flow<Int> = flow {
           for (i in 1..3) {
               delay(timeout)
               println("Emitting $i from ${name}")
               emit(i)
           }
       }

       Flow.amb(
               testFlow("First", 60),
               testFlow("Second", 50),
               testFlow("Third", 70))
              .collect { println("Received ${it}") }

чтобы вывело
Emitting 1 from Second
Received 1
Emitting 2 from Second
Received 2
Emitting 3 from Second
Received 3
Что-то в этом роде: https://pl.kotl.in/esjdXHid9, но я не тестил, и наверное там можно без канала обойтись.
источник

EP

Eugene P. in Kotlin Community
Alexander Nozik
Что-то в этом роде: https://pl.kotl.in/esjdXHid9, но я не тестил, и наверное там можно без канала обойтись.
Наверное, ссылка сломалась
источник