Котлин: Как вернуть переменную из асинхронной лямбды? - PullRequest
0 голосов
/ 18 февраля 2019

Я использую fuel http , чтобы сделать простой запрос GET.Вот мой код:

fun fetchTweets(): List<Tweet> {

    endpoint.httpGet(listOf("user" to "me", "limit" to 20))
        .responseObject(Tweet.Deserializer()) { _, _, result ->
            result.get().forEach { Log.i("TWEET", it.text) }
            val tweets = result.get().toList() //I want to return this
        }
}

Если я сделаю return tweets чуть ниже val tweets, я получу ошибку: return is not allowed here.

Это имеет смысл для меня.Но все еще остается вопрос, как мне написать функцию, которая возвращает переменную, созданную в лямбда-выражении?В этом случае я хочу вернуть tweets

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Используя https://github.com/kittinunf/fuel/tree/master/fuel-coroutines, вы должны иметь возможность написать что-то вроде (я незнаком с библиотекой, это основано только на примере README):

suspend fun fetchTweets(): List<Tweet> {

    val (_, _, result) = endpoint.httpGet(listOf("user" to "me", "limit" to 20))
        .awaitObjectResponseResult(Tweet.Deserializer())
    result.get().forEach { Log.i("TWEET", it.text) }
    return c.get().toList()
}

(Это не такясно, откуда взято c в вашем вопросе; возможно, это опечатка для result.get().toList()?)

Если вы не знакомы с сопрограммами, прочитайте https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html.

0 голосов
/ 18 февраля 2019

Вы можете передать лямбду своему методу:

fun fetchTweets(
        callback: (List<Tweet>) -> Unit
) {

    endpoint.httpGet(listOf("user" to "me", "limit" to 20))
            .responseObject(Tweet.Deserializer()) { _, _, result ->
                result.get().forEach { Log.i("TWEET", it.text) }
                val tweets = c.get().toList()
                callback(tweets)
            }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...