将收集流块执行?



我运行代码A并得到结果A。在我看来,它应该是结果b。

似乎flow.collect { value -> println(value) }块要执行了。

是否执行Flow块的收集?

代码

fun simple(): Flow<Int> = flow { 
println("Flow started")
for (i in 1..3) {
delay(300)
emit(i)
}
}
fun main() = runBlocking<Unit> {
println("Calling simple function...")
val flow = simple()
println("Calling collect...")
flow.collect { value -> println(value) } //Block?
println("Calling collect again...")   
}

结果

Calling simple function...
Calling collect...
Flow started
1
2
3
Calling collect again...

结果B

Calling simple function...
Calling collect...
Flow started
Calling collect again...
1
2
3

BTW,我运行代码1,得到结果1,如我所料。

代码1

fun simple(): Flow<Int> = flow {
for (i in 1..3) {
delay(100) 
emit(i) 
}
}
fun main() = runBlocking<Unit> {  
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}  
simple().collect { value -> println(value) } 
}

结果1

I'm not blocked 1
1
I'm not blocked 2
2
I'm not blocked 3
3

挂起函数不阻塞,但它们同步的,这意味着协程中的代码执行在继续之前等待挂起函数返回。挂起函数调用和阻塞函数调用的区别在于,当协程等待挂起函数返回时,线程被释放以用于其他任务。

collect是一个挂起函数,它在内部重复和同步地调用它的lambda(挂起,而不是阻塞),直到Flow完成才返回。

launch是启动协程的异步函数。它立即返回而不等待协程完成,这就是为什么代码1的行为如您所期望的。

相关内容

  • 没有找到相关文章

最新更新