簡體   English   中英

完成 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM