можно ли ее как-то сократить (Я к тому, может у корутин есть какой-то функционал специально под такие проблемы? Просто не могу сформулировать его, чтобы загуглить)
private var getConfigurationJob: Deferred<Configuration>? = null
suspend fun getConfiguration(): Configuration {
val currentJob = getConfigurationJob
val job = if(currentJob != null && currentJob.isCompleted.not()) {
currentJob
} else {
coroutineScope.async {
// Тут таска, которая делает запрос к серверу
}.also {
getConfigurationJob = it
}
}
return job.await()
}
await(CoroutineStart.LAZY)? правда, оно не перезапускаеться при завершении
Спасибо за ответ, штука кстати прикольная, но насколько я понял - это не совсем для решения подобных задач. Можно тогда поподробнее, может я что-то упустил?
у вас конфигурация получается единожды или по несколько раз?
coroutineScope.async - беcсмыслено в данном коде, если конечно coroutineScope не специфический. А так делать async и сразу await - бессмысленно
Почему? Если мне нужен Deferred рычаг
а зачем он вам ?
по факту вы выполняете последовательное выполнения
Допустим данная функция с разницей в 1мс вызывается из 2х мест. При первом вызове у меня происходит запрос на сервер. При втором вызове я не хочу делать повторный запрос на сервер, так как результат первого запроса еще не вернулся и для обоих вызывающих я хочу вернуть 1н результат
ага, то-есть вам нужен мулти вызов, но звать два раза не хочется, реальную работу. Ну мютекс вполне может подойти. если там есть нужно для вас апи
Ну вот надо глянуть - штука выглядит похожей на то что мне надо, ну нужно покапаться - спасибо тоже.
Хотя нет. Как сказал Вадим, тут действительно - это просто поможет избавиться от конкурентных вызовов, но не объединит их в один, а просто выполнит последовательнео - мне это, к сожалению, не годится
https://pl.kotl.in/LSgoWRdT2
PS да если делать последовательный запуск - то будет вызов два (N) раза
поставьте время кеширования, используйте мьютекс == профит
Обсуждают сегодня