Kotlin 调用递归lambda表达式

Kotlin 调用递归lambda表达式,kotlin,higher-order-functions,Kotlin,Higher Order Functions,我这里有一个发送请求的函数 fun请求(请求代码:Int,回调:(布尔)->Unit){ val结果=假 //一些工作。。。 回调(结果) } 显然,此函数将lambda表达式作为参数。 现在,当我需要从主函数调用这个函数时,我有一个场景,如果回调结果为真,我需要做一些工作,否则,我需要再次重复请求 fun main(){ 请求(10){结果-> 如果(结果){ //成功 }否则{ //在这里,我需要再次提出请求 请求(10){result2-> //等等。。 } } } } 现在的问题是我

我这里有一个发送请求的函数

fun请求(请求代码:Int,回调:(布尔)->Unit){
val结果=假
//一些工作。。。
回调(结果)
}
显然,此函数将lambda表达式作为参数。 现在,当我需要从主函数调用这个函数时,我有一个场景,如果回调结果为真,我需要做一些工作,否则,我需要再次重复请求

fun main(){
请求(10){结果->
如果(结果){
//成功
}否则{
//在这里,我需要再次提出请求
请求(10){result2->
//等等。。
}
}
}
}
现在的问题是我需要无限期地重复呼叫!!。
如何解决此问题?

您可以做的一件事是,只需调用
main
!由于
main
立即调用
request
,因此调用
main
将调用
request

fun main() {
    request(10) { result ->
        if (result) {
            // Success
        } else {
            main()
        }
    }
}
如果在
main
中的
request
之前有其他代码,只需在立即调用
request
的函数中调用
request

fun requestUntilSuccess() {
    request(10) { result ->
        if (result) {
            // success
        } else {
            requestUntilSuccess()
        }
    }
}

fun main() {
    // some other code...

    requestUntilSuccess()
}
但是,如果请求继续失败,它将永远这样做。您可能需要添加一个
maxTries
参数:

fun requestUntilSuccess(maxTries: Int) {
    if (maxTries == 0) {
        // out of tries
        return
    }
    request(10) { result ->
        if (result) {
            // success
        } else {
            requestUntilSuccess(maxTries - 1)
        }
    }
}

您可以做的一件事是,只需调用
main
!由于
main
立即调用
request
,因此调用
main
将调用
request

fun main() {
    request(10) { result ->
        if (result) {
            // Success
        } else {
            main()
        }
    }
}
如果在
main
中的
request
之前有其他代码,只需在立即调用
request
的函数中调用
request

fun requestUntilSuccess() {
    request(10) { result ->
        if (result) {
            // success
        } else {
            requestUntilSuccess()
        }
    }
}

fun main() {
    // some other code...

    requestUntilSuccess()
}
但是,如果请求继续失败,它将永远这样做。您可能需要添加一个
maxTries
参数:

fun requestUntilSuccess(maxTries: Int) {
    if (maxTries == 0) {
        // out of tries
        return
    }
    request(10) { result ->
        if (result) {
            // success
        } else {
            requestUntilSuccess(maxTries - 1)
        }
    }
}