0 потом 5, ты запустил асинхронную операцию над каждым из этих значений, и у тебя может оказаться так, что для 5 эта операция выполнится быстрее, чем для 0, но тебе надо сначала выдать результат той операции, где был 0?
Точно. И это надо оптимизировать, не ожидая последовательного завершения каждой итерации по отдельности)
На самом деле в таком случае тебе всё равно придётся ждать, когда, например, выполняется операция на 0 и уже завершена операция на 5, раз тебе надо выдавать результаты именно в той последовательности, в которой они пришли из флоу. Другой, менее приятный пример, когда у тебя прежде всего была выполнена операция над последним элементом флоу. Выдать ты его не сможешь никак до тех пор, пока не выполнятся операции над предыдущими элементами. То есть придётся ждать выполнения всех предыдущих операций. С другой стороны ты можешь как-нибудь организовать контроль, например, когда выполнилась операция над n-ым элементом, и после этого проверять выполнилась ли операция на всеми предыдущими элементами. И если она выполнилась, то выдавать элементы от 1 до n. В этом случае придётся завести буфер.
Самое первое и банальное решение аналогично твоему последнему, только с переносом toList после map. В этом случае ты собираешь флоу и для каждого значения запускаешь корутину в необходимом тебе контексте (параллельно дальше собирая флоу). Затем ждёшь пока все они выполняться. Только когда они все выполняться у тебя уже будет просто List, а не flow)
Второй вариант сделать через буфер, как я предложил выше, но тут уже надо серьёзно подумать как это реализовать)
Обсуждают сегодня