Подумайте об этом без сопрограмм. Что бы вы сделали, если бы функции не были приостановлены и были просто обычными функциями?
Вы можете сохранить значения, которые вы передаете, в переменной и проверить, если вы ужекэшируйте его. Если у вас есть, вы можете просто вернуть значения, в противном случае вычислить эти значения.
Если у вас есть какая-то продвинутая логика, которую нужно слушать (например, Subject
s в RxJava), вы можете использоватьKotlin Coroutines Channel
s.
Для создания канала вы можете использовать Channel()
или ConflatedBroadCastChannel()
или другие варианты.Если вы хотите, чтобы ваш канал был точно таким же, как PublishSubject RxJava, вы можете использовать ConflatedBroadCastChannel:
val broadCastChannel = ConflatedBroadcastChannel<Int>()
Вы можете использовать broadCastChannel.offer(value)
для отправки значений в канал.
Для получения значений изКанал, вы можете использовать простой цикл для каждого:
for (i in broadCastChannel.openSubscription()) {
//your values
}