GlobalScope.async(Dispatchers.IO) {
var list = dao.selectAllParentRubrics()
if (list != null) {
list = apiService.retriveRubrics().await().body()!!.response
dao.insertAllRubrics(list)
}
list
}
В этой корутине я хочу получить Deferred<List<Rubric>> (var list). Сначала я делаю запрос из бд и если ничего не приходит из, до я делаю запрос в сеть и кэширую в рубрики в базу данных. В нижней строчке я написал list, чтобы он вернулся обернутым в deferred? скажите это list вернутся и как в котлине определяется что возвращать из asyncа?
Всё правильно, последнее выражение в лямбде, переданной async, "выпадет" в .await(). Единственное — если у вас всё тело функции завёрнуто в async { ... } и возвращает Deferred<...>, то нет смысла саму функцию делать suspend. suspend-функции сами обещают вернуть конечный результат не сразу, вы фактически тут получаете "обещание обещания". Либо suspend fun retrieve(): RetType = withContext(...) { ... } (возможно, это чуть иначе делается с оглядкой на structured concurrency), либо fun retrieve(): Deferred<RetType> = async { ... }. Но если есть возможность поставить suspend, то первый вариант каноничнее (исключение — методы, торчащие как внешнее API, если есть нужда интеропиться с джавой).
Обсуждают сегодня