generator

mangojang·2022년 12월 25일
0

✍️ yield를 통해 함수를 멈출 수 있기 때문에 비동기 통신 할 때 유용하게 사용한다. (필자는 redux- saga를 통해 generator를 접하였다.) 기본적인 사용 방법에 대해 정리 해 보았다.

generator 란?

 function *generator(){
		yield 1;
		yield 2;
		yield 3;
}
  • iterator 이자 iterable을 생성하는 함수
    let iterator = generator();
     
    console.log(iter[Symbol.iterator]() == iter) // true
    ➡️ iterable을 간단하게 표현할 수 있음.
  • 일시 정지재 시작을 실행 할 수 있음. ( yield )
  • for …of 문 사용 가능.

사용 방법

  1. function 뒤에 * 를 붙임.
  2. yield 로 return 지점을 설정 함.
  3. next() method 호출 시 yield를 value로 return.
    1. next() method에 인수를 넣어주면 yield로 값이 넘어감 .

      function* generator(){
      		const index = 1;
          const i = yield index;
          yield i;
      }
      
      let iterator = generator();
      
      iterator.next(); // {value: 1, done: false}
      iterator.next(10); // {value: 10, done: false}
  4. next() method 호출 시 return 값은 { value: n , done: false } 형태 (완료 시, {done: true})

yield*

  • yield* 뒤에 오는 iterator객체를 순차적으로 yield 적용 함.
function* generator() {
    const index = 0;
    yield index;
    yield* [1,2,3,4];
}
let iterator = generator();

  • generator안에 generator를 넣을 수 있음.
    function* generator1(start, end) {
      for (let i = start; i <= end; i++) yield i;
    }
    
    function* generator2() {
      yield* generator1(1, 5);
      yield* generator1(20, 4);
      yield* generator1(97, 112);
    }
    
    let str = '';
    
    for(let code of generator2()) {
      str += code;
    }
    
    console.log(str); // 12345979899100101102103104105106107108109110111112

generator 반복이 끝나는 경우

  1. return 사용

    function *generator(){
    		yield 1;
    		yield 2;
    		yield 3;
    		return 10;
    }
    • { value: return 값 , done: true} 가 되며 끝남.

  2. 에러 발생

    throw()

    • generator yield로 error를 전달 함.
    function* generator(){
    	try{
    		let i = yield 7;
    		console.log("next!");
    		
    	}catch(error){
    		console.log(error);
    	}
    }
    
    let iterator = generator();
    iterator.next();
    iterator.throw( new Error("error!!")); // next! 로 넘어가지 않음. try-catch에서 잡힘.
  3. 반복문 끝 까지 다 실행 된 경우

참고 문헌

profile
한 걸음 한 걸음 계속 걷는 자가 일류다

0개의 댓글