首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foo().collect{. }和启动{foo().collect{.}之间有什么区别?

foo().collect{. }和启动{foo().collect{.}之间有什么区别?
EN

Stack Overflow用户
提问于 2020-04-04 03:19:57
回答 2查看 727关注 0票数 1

代码A得到结果A,代码B得到结果B。

1:是fun foo()协同线吗?如果它是一个coroutines函数,为什么它之前不添加关键字suspend

2:在我看来,coroutines函数是使用launch {...}aync {...}触发的,如果fun foo()是coroutines函数,为什么代码B中的main()乐趣可以直接调用它?

3:代码A和代码B有什么不同?

码A

代码语言:javascript
复制
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

代码语言:javascript
复制
I'm not blocked 1
I'm not blocked 2
6
I'm not blocked 3
7
8

码B

代码语言:javascript
复制
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

代码语言:javascript
复制
I'm not blocked 1
6
I'm not blocked 2
7
I'm not blocked 3
8
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-04 03:24:49

foo函数不是挂起函数,因此可以在协同范围外调用它。此函数构建流并返回流,但流不启动。流只有在调用collect时才会启动,这是一个挂起函数,因此必须在协同范围内调用collectflow是冷的,它们只在调用collect时才开始释放项目,所以构建流不是一个挂起函数,因为它是一个快速的操作。

票数 3
EN

Stack Overflow用户

发布于 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上创建另一个协同线,它也将在主线程上运行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61023358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档