我想知道 flatMapMerge 在這段代碼中是如何作業的:
fun requestFlow(i: Int): Flow<String> = flow {
emit("$i: First")
delay(500) // wait 500 ms
emit("$i: Second")
}
fun main() = runBlocking<Unit> {
val startTime = System.currentTimeMillis() // remember the start time
(1..3).asFlow().onEach { delay(100) } // a number every 100 ms
.flatMapMerge { requestFlow(it) }
.collect { value -> // collect and print
println("$value at ${System.currentTimeMillis() - startTime} ms from start")
}
}
1: First at 136 ms from start
2: First at 231 ms from start
3: First at 333 ms from start
1: Second at 639 ms from start
2: Second at 732 ms from start
3: Second at 833 ms from start
之后requestFlow休眠500毫秒,它繼續emit("$i: **Second**")。看著輸出,我很困惑。我的問題是
- 已
flatMapMerge呼叫asFlow再次(1..3)。或者 - 它是否將 1..3 的流快取在某處以備后用,因為
requestFlow它已經告訴它,“我還沒有完成”
uj5u.com熱心網友回復:
整個序列是這樣的:
- 1 從原始流發出并傳遞給
requestFlow它創建一個新的流構建器,該構建器列印“1:首先在...”然后掛起 500 毫秒。 - 2 從原始流發出并傳遞給
requestFlow它創建一個新的流構建器,該構建器列印“2:首先在...”然后掛起 500 毫秒。(這里我們在記憶體中有兩個掛起的函式)。 - 3 從原始流發出并傳遞給
requestFlow它創建一個新的流構建器,該構建器列印“3:首先在...”然后掛起 500 毫秒。(這里我們在記憶體中有三個掛起的函式)。 - 第一次發射 500 毫秒后,第一個暫停的函式恢復并列印“1:Second at ...”
- 100 毫秒后,第二個函式恢復并列印“2:Second at ...”
- 再過 100 毫秒后,最后一個暫停的函式恢復并列印“3:Second at ...”
flatternMapMerge只應用您提供的轉換并回傳一個Flow<String>. 請注意,這不是掛起函式,因此會立即回傳。
回答你的兩個問題,
- 不,
asFlow不會再次呼叫該函式。 - 它不是快取流,只是將函式掛起 500 毫秒,在此之前做其他事情,并在延遲結束后從停止的地方恢復。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342961.html
