是否可以进行多个并行调用并接受使用Kotlin Flow返回的第一个?

卡索洛兹

基本上,我必须同时使用OkHttp各种地址来发出网络请求我只关心第一个成功的结果。我可以用FlowonKotlin吗?

我一直在环顾四周,但我一直在努力使请求并行运行,始终按顺序运行。

该代码基本上采用地址列表,并且应返回唯一有效的地址;如果无效,则返回null。

谢谢。

编辑:我应该提一下我打算在Android上使用它。我可能可以用RX做到这一点,但想学习Flow还试图限制我添加到应用程序中的库。

编辑:我已经将答案标记为正确,但是那不是我的做法,但是它使我非常接近我的做法,但是由于我是新手,Flow所以我不知道我的做法是否正确,尽管我我确信在我测试之后它可以正常工作。

我有一个NoSuchElementException找不到时抛出的函数它调用searchForIPAsync哪个suspend函数完成所有OkHttp工作并返回true|false

@Throws(NoSuchElementException::class)
private suspend fun findWorkingIP(ipsToTest: MutableList<String>): String? = ipsToTest
        .asFlow()
        .flatMapMerge(ipsToTest.size)
        { impl ->
            flow<String?> {
                val res = connectionHelper.searchForIPAsync(getURLToTest(impl))
                if (res) {
                    emit(impl)
                } else {
                }
            }
        }.first()

然后调用此方法,并在未找到任何内容的情况下捕获异常:

        try {
            val ipFound = findWorkingIP(ipsToTest)
            Log.w(TAG, "find: Got something " + ipFound);
            return ipFound
        } catch (ex: NoSuchElementException) {
            Log.w(TAG, "find: not found");
        }
马克·托波尼克(Marko Topolnik)

尽管另一个答案中基于Flow的解决方案非常符合您的需求,但是不幸的是,从Kotlin 1.3.2开始,Flow的实现存在一个破坏它错误该错误已经有建议的修复程序,因此应该在下一个Kotlin修补程序版本中解决。同时,这是使用asyncChannel代替的类似解决方案

suspend fun getShortUrl(urls: List<String>): String = coroutineScope {
    val chan = Channel<String?>()
    urls.forEach { url ->
        launch {
            try {
                fetchUrl(url)
            } catch (e: Exception) {
                null
            }.also { chan.send(it) }
        }
    }
    try {
        (1..urls.size).forEach { _ ->
            chan.receive()?.also { return@coroutineScope it }
        }
        throw Exception("All services failed")
    } finally {
        coroutineContext[Job]!!.cancelChildren()
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用where()foreach返回多个源中的第一个项目

来自分类Dev

使用合并从2个表中返回第一个非空值

来自分类Dev

从函数调用递归函数仅返回第一个值

来自分类Dev

GetTokenInformation在第一个调用中返回ERROR_INSUFFICIENT_BUFFER

来自分类Dev

仅第一个数据库调用返回的数据

来自分类Dev

链码调用的第一个返回值的目的是什么?

来自分类Dev

GetTokenInformation在第一个调用中返回ERROR_INSUFFICIENT_BUFFER

来自分类Dev

Lodash,循环调用函数并返回第一个匹配结果

来自分类Dev

如何对基于数组的文档进行排序并仅返回结果的第一个元素

来自分类Dev

如何在desc Jquery之后对第一个asc进行排序并返回初始状态

来自分类Dev

ActiveRecord-“作用域”中的“第一个”方法返回多个记录

来自分类Dev

读取具有多个子节点的xml文件只会返回第一个节点

来自分类Dev

UISearchController仅返回第一个结果,但Core Data有多个结果

来自分类Dev

如何在数组中搜索多个键并返回第一个找到的值?

来自分类Dev

多个 If else 语句只返回第一个值

来自分类Dev

带有lambda的min是否总是在python中返回第一个值?

来自分类常见问题

是否有NumPy函数返回数组中某物的第一个索引?

来自分类Dev

仅使用$ elemMatch返回子数组的第一个元素

来自分类Dev

获取数组中的第一个元素并使用Aggregate返回?

来自分类Dev

如何使用迭代器返回ArrayList中的第一个结果

来自分类Dev

IBM Watson语音到文本仅使用Java SDK返回第一个单词

来自分类Dev

使用逻辑索引时,大熊猫仅应用返回第一个值

来自分类Dev

使用React Table返回第一个值来记录dataMax

来自分类Dev

使用注入仅返回第一个值并想要总计

来自分类Dev

获取使用eval的第一个管道命令的返回码?

来自分类Dev

使用reduce函数时返回第一个元素

来自分类Dev

如何使用vba返回word中段落上方的第一个标题的值?

来自分类Dev

使用 map 返回多维数组中的第一个索引

来自分类Dev

使用 PostgreSQL xpath 函数并从数组中获取第一个返回值

Related 相关文章

  1. 1

    使用where()foreach返回多个源中的第一个项目

  2. 2

    使用合并从2个表中返回第一个非空值

  3. 3

    从函数调用递归函数仅返回第一个值

  4. 4

    GetTokenInformation在第一个调用中返回ERROR_INSUFFICIENT_BUFFER

  5. 5

    仅第一个数据库调用返回的数据

  6. 6

    链码调用的第一个返回值的目的是什么?

  7. 7

    GetTokenInformation在第一个调用中返回ERROR_INSUFFICIENT_BUFFER

  8. 8

    Lodash,循环调用函数并返回第一个匹配结果

  9. 9

    如何对基于数组的文档进行排序并仅返回结果的第一个元素

  10. 10

    如何在desc Jquery之后对第一个asc进行排序并返回初始状态

  11. 11

    ActiveRecord-“作用域”中的“第一个”方法返回多个记录

  12. 12

    读取具有多个子节点的xml文件只会返回第一个节点

  13. 13

    UISearchController仅返回第一个结果,但Core Data有多个结果

  14. 14

    如何在数组中搜索多个键并返回第一个找到的值?

  15. 15

    多个 If else 语句只返回第一个值

  16. 16

    带有lambda的min是否总是在python中返回第一个值?

  17. 17

    是否有NumPy函数返回数组中某物的第一个索引?

  18. 18

    仅使用$ elemMatch返回子数组的第一个元素

  19. 19

    获取数组中的第一个元素并使用Aggregate返回?

  20. 20

    如何使用迭代器返回ArrayList中的第一个结果

  21. 21

    IBM Watson语音到文本仅使用Java SDK返回第一个单词

  22. 22

    使用逻辑索引时,大熊猫仅应用返回第一个值

  23. 23

    使用React Table返回第一个值来记录dataMax

  24. 24

    使用注入仅返回第一个值并想要总计

  25. 25

    获取使用eval的第一个管道命令的返回码?

  26. 26

    使用reduce函数时返回第一个元素

  27. 27

    如何使用vba返回word中段落上方的第一个标题的值?

  28. 28

    使用 map 返回多维数组中的第一个索引

  29. 29

    使用 PostgreSQL xpath 函数并从数组中获取第一个返回值

热门标签

归档