Javascript

[Javascript] Generator

sian han 2022. 12. 3. 20:49

※ Generator

  - 함수의 실행을 중간에 멈췄다가 재개할 수 있는 기능

  - Itarable 이면서 iterator 이다

 

▶ 기본 구조

function 옆에 * 을 붙이고

yield 키워드 사용 - yield 에서 함수의 실행을 멈출 수 있다

function* fn (){
	console.log(1);
	yield 1;
    
    console.log(2);
    yield 2;
    
   	console.log(3);
    console.log(4);
    yield 3;
    return "finish";
}

const a = fn();

fn() 함수를 실행하면 generator 객체가 반환됨

 

 

▷ next()

a.next(); // console : 1
// {value : 1, done : false}

를 실행하면 가장 가까운 yield 문을 만날때까지 실행되고 데이터 객체를 반환함.

반환된 객체는 {value, done} 프로퍼티를 갖는다

value : 만난 yield 의 오른쪽에 있는 값 (값 생략 시 undefined) 

done : 함수코드가 끝났는지를 나타냄

 

a.next(); //console : 2
//{value: 2, done: false}
a.next(); // console : 3 4
//{value: 3, done: false}
a.next();
//{value: finish, done: true}
a.next();
//{value : undefined, done: true}

 

 

▷ return()

  - return 메서드를 호출하면 그 즉시 done 속성값이 true 가 됨

a.return('End');
//{value : "End", done: true}
a.next();
//{value : undefined, done : true}

return 사용 후 next 를 사용하면 value 는 얻어올 수 없고 done 은 true 이다

 

 

 

▷ throw()

 - throw 도 마찬가지로 done 을 true 로 바꿔준다.

function* fn (){

	try{
        console.log(1);
        yield 1;

        console.log(2);
        yield 2;

        console.log(3);
        console.log(4);
        yield 3;
        return "finish";
        
    } catch(e){
    	console.log(e);
    }
}

const a = fn();
a.throw(new Error('err')) // console : error 로그
//{value : undefined, done: true}
a.next();
//{value:undefined,done:true}