kotlin - 在 Kotlin 中等待异步进程结果的函数
问题描述
假设我想编写一个函数,通过一些需要满足的条件来检查异步过程的一些结果。该函数应该使用一些最大等待时间、循环等待时间并且应该迭代直到满足条件。
代码和伪代码的混合如下:
fun waitUntilConditionIsMatched() {
val maximumWaitTime = Duration.ofSeconds(10L)
val maximum = currentTimeMillis() + maximumWaitTime.toMillis()
println("Waiting for maximum of $maximumWaitTime for a condition to be matched...")
while (currentTimeMillis() <= maximum) {
if (conditionIsMatched) {
println("...condition matched")
break
} else {
doWait(Duration.ofMillis(500))
}
}
println("...timeout exceeded. Condition was not matched.")
}
有没有一种惯用的方式如何在 Kotlin 中编写它?
解决方案
您应该查看Kotlin Coroutines,它是专注于异步编程的语言的一个相当大的分支。
您在 Kotlin 中的意思的示例应用程序(针对 JVM):
import kotlinx.coroutines.*
// dummy condition
var condition = false
fun main(args: Array<String>) {
// this code block is all that's needed to raise condition after half a second
// without blocking current thread
GlobalScope.launch{
delay(500)
println("condition ready")
condition = true
}
// block the current thread while waiting for condition
// this is required to use a suspend function
val result = runBlocking{
println("waiting for result started")
waitForCondition(1000, 100)
}
println("condition was met:" + result)
}
// waits until condition is ready and return true when it is; otherwise returns false
// tailrec function gets rolled out into normal loop under the hood
suspend tailrec fun waitForCondition(maxDelay: Long, checkPeriod: Long) : Boolean{
if(maxDelay < 0) return false
if(condition) return true
delay(checkPeriod)
return waitForCondition(maxDelay - checkPeriod, checkPeriod)
}
推荐阅读
- c# - C# - 如何使用上下文菜单正确触发应用程序打开
- python - discord.py on_message 作者在私人频道中没有返回
- r - 在 ggplot 图中排序方面失败
- cassandra - 在 Cassandra 中的列更新后读取几列的响应延迟
- python - 基于 Pandas DataFrame 更新 SQL 记录
- angular - 如何共享具有不同域的两个站点的登录信息?
- python - 如何使用 knn 获取最近的项目(邻居)?
- android - Kotlin uri.getQueryParameter 不适用于 hashroute
- python - Python:来自字符串的伪随机颜色
- javascript - React 错误对象作为 React 子对象无效(找到:带键的对象 {$$typeof, type, compare)