Coroutines Flow 2편 –

취소 흐름

흐름은 코루틴의 기본 협력 취소를 따릅니다.

일반적으로 전환 가능한 정지 기능(예: 지연) F낮은 흐름에서 값 수집이 일시 중단되면 취소될 수 있습니다.

아래 예는 Flow가 withTimeout또는Null 블록에서 실행하면 시간 초과 시 흐름이 어떻게 중단되고 코드 실행이 중지되는지 보여줍니다.

fun simple(): Flow<Int> = flow { 
    for (i in 1..3) {
        delay(100)          
        println("Emitting $i")
        emit(i)
    }
}

fun main() = runBlocking<Unit> {
    withTimeoutOrNull(250) { // Timeout after 250ms 
        simple().collect { value -> println(value) } 
    }
    println("Done")
}

완전한 코드는 여기에서 찾을 수 있습니다

간단히 기능 흐름다음 출력*1을 제공하는 2개의 숫자만 출력됩니다.

Emitting 1
1
Emitting 2
2
Done

더 자세한 내용을 알고 싶다면 흐름 취소 확인 부분을 ​​살펴보자


다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

*하나. 단순 함수 내의 흐름은 100ms 동안 대기하고 출력이 실행됩니다.

제한 시간이 250ms이므로 두 번째가 실행된 후 실행이 중단됩니다.


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 비동기 흐름 – 흐름 억제 기본 사항

원본 텍스트의 최종 편집: 2022년 9월 28일


흐름 빌더

이전 예제 중 흐름 { … } 빌더는 가장 간단한 빌더입니다.

Flow를 선언할 수 있는 다른 빌더도 있습니다.

  • 빌더는 특정 값 집합을 출력하는 흐름을 정의합니다.

  • 다양한 컬렉션과 시퀀스는 .asFlow() 확장 기능으로 Flow로 변환할 수 있습니다.

(1..3).asFlow().collect { value -> println(value) }

완전한 코드는 여기에서 찾을 수 있습니다


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 비동기 흐름 – Flow Builder

원본 텍스트의 최종 편집: 2022년 9월 28일


흐름 중간 연산자

흐름Collections 및 Sequence와 같은 연산자를 사용하여 변환할 수 있습니다.

중간 연산자는 업스트림 흐름에 적용되고 다운스트림 흐름을 반환합니다.

이러한 연산자는 Flow만큼 차갑습니다.

이러한 연산자 자체를 호출하는 것은 정지 기능이 아닙니다.

이것은 빠르게 작동하고 새로 변환된 흐름을 반환합니다.

기본 연산자 지도 또는 필터이러한 연산자와 시퀀스의 중요한 차이점은 이러한 연산자 내의 코드 블록이 일시 중단 함수를 호출할 수 있다는 점입니다.

예를 들어 요청을 이행하는 것이 긴 작업이고 일시 중단 기능으로 구현된 경우에도 흐름붓다 지도 연산자를 사용하여 결과를 일치시킬 수 있습니다.

suspend fun performRequest(request: Int): String {
    delay(1000) // imitate long-running asynchronous work
    return "response $request"
}

fun main() = runBlocking<Unit> {
    (1..3).asFlow() // a flow of requests
        .map { request -> performRequest(request) }
        .collect { response -> println(response) }
}

완전한 코드는 여기에서 찾을 수 있습니다

이렇게 하면 다음과 같이 3줄의 출력이 생성되며 각 줄은 이전 줄보다 1초 뒤에 나타납니다.

response 1
response 2
response 3

변환 연산자

흐름변환 연산자 중에서 변환오전. 맵 또는 필터와 같은 간단한 변환을 에뮬레이트하거나 복잡한 변환을 구현하는 데 사용할 수 있습니다.

변환 여러 번 값을 반환하는 연산자 방출하다 할수있다.

예를 들어 긴 비동기 요청을 만들기 전에 변환을 사용하여 문자열을 출력하고 응답을 기다릴 수 있습니다.

(1..3).asFlow() // a flow of requests
    .transform { request ->
        emit("Making request $request") 
        emit(performRequest(request)) 
    }
    .collect { response -> println(response) }

완전한 코드는 여기에서 찾을 수 있습니다

이 코드의 결과는 다음과 같습니다.

Making request 1
response 1
Making request 2
response 2
Making request 3
response 3

크기 제한 연산자

가져가다와 같은 중간 크기 제한 연산자는 해당 임계값에 도달하면 흐름을 중단합니다.

코루틴 중단은 항상 예외이것은 던지면 된다.

시도 { … } 마지막으로 { … } 다음과 같은 전반적인 자원 관리를 위한 기능 B. 실행 취소, 정상적으로 작동합니다.

fun numbers(): Flow<Int> = flow {
    try {                          
        emit(1)
        emit(2) 
        println("This line will not execute")
        emit(3)    
    } finally {
        println("Finally in numbers")
    }
}

fun main() = runBlocking<Unit> {
    numbers() 
        .take(2) // take only the first two
        .collect { value -> println(value) }
}

완전한 코드는 여기에서 찾을 수 있습니다

지불하다() 기능 내에서 흐름 { … } body*1을 실행하면 두 번째 숫자가 반환됩니다.

방출하다이 코드의 출력에서 ​​명확하게 볼 수 있습니다.

1
2
Finally in numbers

다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.

*하나. 본문은 { … } 내부의 코드입니다.


이 문서는 공식 코루틴 문서를 번역한 것입니다.

원래의: 비동기 흐름 – 중간 흐름 연산자

원본 텍스트의 최종 편집: 2022년 9월 28일