调用递归 lambda 表达式
Calling a recursive lambda expression
我这里有发送请求的函数
fun request(requestCode: Int, callback: (Boolean) -> Unit) {
val result = false
// Some job...
callback(result)
}
显然,这个函数接受一个 lambda 表达式作为参数。
现在,当我需要从主函数调用这个函数时,我有这样的场景,如果回调结果为真,我需要做一些工作,否则,我需要再次重复请求。
fun main() {
request(10) { result ->
if (result) {
// Success
} else {
// Here I need to make the request again
request(10) { result2 ->
// And so on..
}
}
}
}
现在的问题是我需要无限期地重复调用!!
我该如何解决这个问题?
你可以做的一件事就是,打电话给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)
}
}
}
我这里有发送请求的函数
fun request(requestCode: Int, callback: (Boolean) -> Unit) {
val result = false
// Some job...
callback(result)
}
显然,这个函数接受一个 lambda 表达式作为参数。 现在,当我需要从主函数调用这个函数时,我有这样的场景,如果回调结果为真,我需要做一些工作,否则,我需要再次重复请求。
fun main() {
request(10) { result ->
if (result) {
// Success
} else {
// Here I need to make the request again
request(10) { result2 ->
// And so on..
}
}
}
}
现在的问题是我需要无限期地重复调用!! 我该如何解决这个问题?
你可以做的一件事就是,打电话给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)
}
}
}