首页 > 解决方案 > 在 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

解决方案


您应该查看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)
}

推荐阅读