![](/img/trans.png)
[英]How to make several async (RX) calls, and wait for them to finish in Kotlin?
[英]Completing list of Async calls in Kotlin
我們有一個本質上是異步的操作列表。 我們想要完成所有的操作讓我們說並且想要做另一個任務。 我對 Kotlin 協程概念完全陌生,無法完成這項任務。 我在互聯網上搜索了很多,但由於我沒有使用 kotlin 協程或 kotlin 的另一個異步服務來執行此操作的整體經驗。 任何人都知道如何完成這項任務將非常有幫助。 假設我在列表中有 20 個元素,我想對每個元素進行操作,這本質上是異步的。
response.data?.let { dataArray ->
if (dataArray.isNotEmpty()) {
it.forEach {
it.unpair().done{
// Async call.
}
}
// All async operation completed do another task.
} else {
// Array is empty.
}
}
確保您在協程 scope 中運行它
val requests = ArrayList<Deferred<Unit>>()
val dataArray = response.data ?: return
dataArray.forEach { data ->
data.unpair().done {
// YOUR METHOD starts running immediately
requests.add( async { YOUR METHOD } )
}
}
// Waits for all YOUR METHOD's to finish
requests.awaitAll()
我認為對列表中的每個項目執行異步任務的一種干凈方法是使用map
然后awaitAll
。 結果列表包含協程恢復后的所有結果。
從協程內部:
val unpackedData = results.data.orEmpty().map {
async {
it.unpair().done()
// I don't really know what type of object this is, but you can do anything in
// this block and whatever the lambda eventually returns is what the list will
// contain when the outer coroutine resumes at the awaitAll() call
}
}.awaitAll()
// Make other calls here. This code is reached when all async tasks are done.
orEmpty()
function 是一種將可空列表轉換為不可空列表的便捷方法,通過刪除分支使代碼更簡單。 有時它並不真正適用,但通常您可以消除嵌套的 if 語句或提前返回。 就像如果你迭代你的結果數據並且它是空的,那可能很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.