728x90
반응형

제너레이터(generator)

Iterator를 생성함으로써 동기적으로 비동기 가능

제너레이터(generator)는 Iterator를 사용해 자신의 실행을 제어하는 함수

일반적인 함수는 매개변수를 받고 값을 반환하는데 함수를 호출하면 그 함수가 종료될 때까지 제어권이 없음

그러나 제너레이터(generator)를 사용하면 여러 개의 값을 필요에 따라 하나씩 반환(yield)할 수 있음

 

 

제너레이터 함수

제너레이터를 만드는 '제너레이터 함수’라 불리는 특별한 문법 구조가 있음

바로 function*

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

제너레이터 함수는 일반 함수와 동작 방식이 다름

제너레이터 함수를 호출하면 코드가 실행되지 않고, 대신 실행을 처리하는 특별 객체, '제너레이터 객체’가 반환됨

 

예제 👇

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

// '제너레이터 함수'는 '제너레이터 객체'를 생성
let generator = generateSequence();
alert(generator); // [object Generator]

함수의 본문 코드는 아직 실행되지 X

 

 

generator.next();

next()는 제너레이터의 주요 메서드임

next()를 호출하면 가장 가까운 yield <value>문을 만날 때까지 실행이 지속(value를 생략할 수도 있는데, 이 경우엔 undefined가 됨)

이후, yield <value>문을 만나면 실행이 멈추고 반환하고자 하는 값인 value가 바깥 코드에 반환됨

 

next()는 항상 아래 두 프로퍼티를 가진 객체를 반환함

✔ value: 산출 값

done: 함수 코드 실행이 끝났으면 true, 아니라면 false

 

실행 예제 👇

function* generateSequence() {
  yield 1;
  yield 2;
  return 3;
}

let generator = generateSequence();

// 첫 번째 산출 값을 받는 예시
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}

// 두 번째 산출 값을 받는 예시
let two = generator.next();
alert(JSON.stringify(two)); // {value: 2, done: false}

// generator.next()를 또 호출하면 실행은 return문에 다다르고 함수가 종료
let three = generator.next();
alert(JSON.stringify(three)); // {value: 3, done: true}

제너레이터가 종료됨

마지막 결과인 value:3 done:true를 통해 이를 확인할 수 있음

 

 

💥 제너레이터가 반환하는 값을 사용하려 할때는 yield를 써야하고, return은 제너레이터를 중간에 종료하는 목적으로만 사용하는 것이 좋음

👉 제너레이터에 return을 쓸 때는 반환값을 쓰지 않는 것이 좋음

반응형

'프로그래밍 > React' 카테고리의 다른 글

takeEvery, takeLatest, takeLeading  (0) 2021.04.26
redux-saga call, fork  (0) 2021.04.22
Redux-thunk와 Redux-saga 비교  (0) 2021.04.20
redux-thunk란?  (0) 2021.04.19
'React' must be in scope when using JSX 오류 해결  (0) 2021.04.13
복사했습니다!