代码A得到结果A,代码B得到结果B。
1:是fun foo()协同线吗?如果它是一个coroutines函数,为什么它之前不添加关键字suspend?
2:在我看来,coroutines函数是使用launch {...}或aync {...}触发的,如果fun foo()是coroutines函数,为什么代码B中的main()乐趣可以直接调用它?
3:代码A和代码B有什么不同?
码A
fun main() = runBlocking<Unit> {
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
launch {
foo().collect { value -> println(value) }
}
}
fun foo(): Flow<Int> = flow {
for (i in 1..3) {
delay(100)
emit(i+5)
}
}结果A
I'm not blocked 1
I'm not blocked 2
6
I'm not blocked 3
7
8码B
fun main() = runBlocking<Unit> {
launch {
for (k in 1..3) {
println("I'm not blocked $k")
delay(100)
}
}
foo().collect { value -> println(value) }
}
fun foo(): Flow<Int> = flow {
for (i in 1..3) {
delay(100)
emit(i+5)
}
}结果B
I'm not blocked 1
6
I'm not blocked 2
7
I'm not blocked 3
8发布于 2020-04-04 03:24:49
foo函数不是挂起函数,因此可以在协同范围外调用它。此函数构建流并返回流,但流不启动。流只有在调用collect时才会启动,这是一个挂起函数,因此必须在协同范围内调用collect。flow是冷的,它们只在调用collect时才开始释放项目,所以构建流不是一个挂起函数,因为它是一个快速的操作。
发布于 2020-04-04 03:59:20
1:有趣的foo()协同是吗?为什么它不添加关键字挂起之前,如果它是一个coroutines函数?
实际上,foo()是一个返回流的正则函数。
2:在我看来,coroutines函数是使用启动{.}或aync {.}触发的,如果foo()是coroutines函数,为什么代码B中的main()好玩可以直接调用它?
还使用runBlocking{...}、runBlockingTest{...}、produce{...}和actor{...}。在哪里构建/创建/声明流并不重要,重要的是在哪里调用终端操作符(如collect),它们是挂起函数的,必须在协同线内或在另一个挂起函数中调用。顺便说一句,您正在coroutine中运行所有的主要方法,因为您将它包装在一个runBlocking块中。
3:代码A和代码B有什么不同?
没有。您只是在代码A上创建另一个协同线,它也将在主线程上运行。
https://stackoverflow.com/questions/61023358
复制相似问题