Функция для ожидания результата асинхронного процесса в Котлине - PullRequest
0 голосов
/ 16 апреля 2019

Допустим, я хочу написать функцию, которая проверяет некоторый результат асинхронного процесса по некоторому условию, которое должно быть выполнено. Эта функция должна использовать некоторое максимальное время ожидания, время ожидания цикла и должна повторяться, пока не будет выполнено условие.

Смесь кода и псевдокода выглядит следующим образом:

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?

1 Ответ

0 голосов
/ 16 апреля 2019

Вы должны взглянуть на 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...