Size: a a a

Kotlin Community

2020 July 06

КР

Кирилл Романенко... in Kotlin Community
Anton Potekhin
Господа знатоки:

val ids: List<Int>
val transform: Flow<Any> = ids.asFlow().transform<Int, Result> { id ->
   
val result = remote.makeRequest(id)
   
emit(result)
}

вот так получается последовательно посылается запрос для каждого id из списка ids. А как красивей сделать чтобы запросы посылались параллельно ?
val requests = ids.map { id -> async { remote.makeRequest(id) } }

А потом можешь
requests.awaitAll()
источник

BP

Bogdan Panchenko in Kotlin Community
Anton Potekhin
Господа знатоки:

val ids: List<Int>
val transform: Flow<Any> = ids.asFlow().transform<Int, Result> { id ->
   
val result = remote.makeRequest(id)
   
emit(result)
}

вот так получается последовательно посылается запрос для каждого id из списка ids. А как красивей сделать чтобы запросы посылались параллельно ?
flow.flatMapMerge
источник

BP

Bogdan Panchenko in Kotlin Community
Там параметер есть сколько операций вместе выполнятся могут
источник

AP

Anton Potekhin in Kotlin Community
@indrih17 , @SchFuntik  спасибо
источник

AP

Anton Potekhin in Kotlin Community
Кирилл Романенко
val requests = ids.map { id -> async { remote.makeRequest(id) } }

А потом можешь
requests.awaitAll()
ЧТо-то я не понял походу 😉
Делаю так:
fun doA(ids: List<Int>): Flow<Result> = flow {
   
ids.mapmap { id ->
       
async {
           
val result = remote.request(id)
           
emit(result)
       
}
   }
.awaitAll()
}

и получаю  java.lang.IllegalStateException: Flow invariant is violated:
     Emission from another coroutine is detected.
     Child of DeferredCoroutine{Active}@7cdd840, expected child of StandaloneCoroutine{Active}@c08c379.
     FlowCollector is not thread-safe and concurrent emissions are prohibited.
     To mitigate this restriction please use 'channelFlow' builder instead of 'flow'
источник

AP

Anton Potekhin in Kotlin Community
почему обрываются все запросы кроме первого ?
источник

КР

Кирилл Романенко... in Kotlin Community
Anton Potekhin
ЧТо-то я не понял походу 😉
Делаю так:
fun doA(ids: List<Int>): Flow<Result> = flow {
   
ids.mapmap { id ->
       
async {
           
val result = remote.request(id)
           
emit(result)
       
}
   }
.awaitAll()
}

и получаю  java.lang.IllegalStateException: Flow invariant is violated:
     Emission from another coroutine is detected.
     Child of DeferredCoroutine{Active}@7cdd840, expected child of StandaloneCoroutine{Active}@c08c379.
     FlowCollector is not thread-safe and concurrent emissions are prohibited.
     To mitigate this restriction please use 'channelFlow' builder instead of 'flow'
А зачем тебе тут флоу?
источник

AP

Anton Potekhin in Kotlin Community
мне нужно во viewmodel асинхронно получать результаты запроса (remote.request) и выводить результат для каждого id как только он пришел
источник

I

Igor in Kotlin Community
Vladimir Petrakovich
Как будто таскать повсюду CancellationToken лучше. Вполне норм дефолт.
Знаю я одного тимлида из jb, который бы с этим поспорил)
Не хочу оценивать сам дефолт, только поделился трейдофы из практики.
источник

КР

Кирилл Романенко... in Kotlin Community
Anton Potekhin
мне нужно во viewmodel асинхронно получать результаты запроса (remote.request) и выводить результат для каждого id как только он пришел
Ну так ты этого не указал в первом вопросе.
источник

AP

Anton Potekhin in Kotlin Community
Кирилл Романенко
Ну так ты этого не указал в первом вопросе.
сорян . значит плохо описал вопрос.
источник

КР

Кирилл Романенко... in Kotlin Community
Anton Potekhin
сорян . значит плохо описал вопрос.
Сделай тогда по-другому
1) замени flow на channelFlow
2) замени async на launch
Тогда, по идее, должно быть норм.
источник

AP

Anton Potekhin in Kotlin Community
Кирилл Романенко
Сделай тогда по-другому
1) замени flow на channelFlow
2) замени async на launch
Тогда, по идее, должно быть норм.
channelFlow помог спасибо.
источник

BP

Bogdan Panchenko in Kotlin Community
Anton Potekhin
channelFlow помог спасибо.
Его так-то flatMapMerge и использует 😉.
источник

SZ

Sergey Zolotov in Kotlin Community
источник

BP

Bogdan Panchenko in Kotlin Community
прекрасно!
источник

AN

Alexander Nozik in Kotlin Community
👍
источник

BP

Bogdan Panchenko in Kotlin Community
ну не так много как  в М2
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
ну не так много как  в М2
Ну пара существенных вещей. Вообще, оно и должно быть меньше.  Чем меньше новых фич, тем ближе к релизу
источник

SZ

Sergey Zolotov in Kotlin Community
я так то думал релиз весной будет
источник