생성기 이해하기

omnigi·2022년 2월 26일
0

Typescript Do it

목록 보기
17/23

yield는 마치 return 키워드처럼 값을 반환합니다. yield는 반드시 function* 키워드를 사용한 함수에서만 호출할 수 있음.

ex generator

export function* generator(){
    console.log("genderator started...")
    let value = 1
    while(value < 4)
        yield value++
    console.log("generator finished...")
}

generator-test

import {generator} from "./06/generator"
for(let value of generator())
    console.log(value)

setInterval 함수와 생성기의 유사성

생성기가 동작하는 방식은 단일스레드로 동작하는 프로그래밍 언어가 마치 다중스레드로 동작하는 것처럼 보이게 하는 기능을 합니다.

const intervalID = setInterval(콜백함수, 호출주기)

setInterval 함수는 무한히 반복하지만 clearInterval 함수를 사용하면 멈출 수 있습니다.

clearInterval(intervalID)

setInterval.ts

const period = 1000
let count = 0
console.log('program started...')
const id = setInterval(() => {
    if(count >= 12){
        clearInterval(id)
        console.log("program finished...")
    }
    else{
        console.log(++count)
    }
}, period)

function* 키워드

function* 키워드로 함수를 선언한다
함수 몸통 안에 yield문이 있다.

생성기는 오직 function* 키워드로 선언해야 하므로 화살표 함수로는 생성기를 만들 수 없습니다. 생성기는 반복기를 제공하는 반복기 제공자로서 동작합니다.

yield 키워드

반복기를 자동으로 만들어 준다
반복기 제공자 역할도 수행한다.

이제 function* 키워드를 이용해 생성기 형태로 함수를 만들기

export function* rangeGenerator(from: number, to: number){
	let value = from
    while(value < to){
    	yield value++
    }
}

yield 키워드

yield는 단순히 값을 대상으로 동작하지만, yield* 은 다른 생성기나 배열을 대상으로 동작합니다

function* gen12() {
    yield 1
    yield 2
}

export function* gen12345(){
    yield* gen12()
    yield* [3, 4]
    yield 5
}
console.log(gen12345)

index.ts

import { gen12345 } from "./06/yield-star";

for(let value of gen12345())
  console.log(value)

yield 반환값

yield연산자는 값을 반환합니다.

export function* gen(){
    let count = 5
    let select = 0;
    while(count--){
        select = yield 
            `you select ${select}`
    }
}

index.ts

0개의 댓글