수학과의 좌충우돌 프로그래밍

[ES6] generator 본문

웹프로그래밍/ES6

[ES6] generator

ssung.k 2020. 1. 5. 04:30

generator

generator 는 중간에 멈출 수 있는 함수입니다.

일반적인 함수를 생각해보면 함수를 실행함과 동시에 함수의 처음부터 끝까지 한 번에 실행합니다.

하지만 generator 함수는 일시적으로 정지할 수 있고, 이를 다시 시작할 수 있습니다.

 

이를 사용하기 위해서는 function 뒤에 * 를 붙여주면 함수 내부에서는 yield 를 사용할 수 있습니다.

함수가 yield 를 만나게 되면 해당 함수는 일시적으로 정지되고 yield 뒤에 인자를 반환합니다.

일반적인 함수의 return 과 비슷한 역할을 하고 있습니다.

function* fruits() {
  yield "apple";
  yield "banana";
  yield "melon";
  yield "strawberry";
}

 

해당 함수를 찍어보았지만 Generator 라는 말만 나오고 원하는 값은 얻을 수 없습니다.

function* fruits() {
  yield "apple";
  yield "banana";
  yield "melon";
  yield "strawberry";
}

const fruitGenerator = fruits();

console.log(fruitGenerator);
// Object [Generator] {}

 

값을 얻기위해서는 next() 를 통해 얻을 수 있습니다.

valueyield 뒤에 나온 인자값이 반환되고, done 은 generator가 아직 끝나지 않았음을 의미합니다.

console.log(fruitGenerator.next());
// { value: 'apple', done: false }

 

이를 반복하면 yield 가 더 이상 끝나지 않고 함수가 종료될 시점에 donetrue 로 반환합니다.

console.log(fruitGenerator.next());
console.log(fruitGenerator.next());
console.log(fruitGenerator.next());
console.log(fruitGenerator.next());
console.log(fruitGenerator.next());

/*
{ value: 'apple', done: false }
{ value: 'banana', done: false }
{ value: 'melon', done: false }
{ value: 'strawberry', done: false }
{ value: undefined, done: true }
*/

 

값에 접근하기 위해서는 value 를 통해 접근합니다.

console.log(fruitGenerator.next().value); 
// apple

 

generator 를 도중에 끝내는 방법으로는 두 가지가 존재합니다.

  • return

    return 을 통해서 정상적으로 종료시킬 수 있으며 value 에는 return에서 받은 값 인자가 done 에는 true가 들어갑니다.

    console.log(fruitGenerator.next());
    console.log(fruitGenerator.return("end"));
    console.log(fruitGenerator.next());
    
    /*
    { value: 'apple', done: false }
    { value: 'end', done: true }
    { value: undefined, done: true }
    */
    

     

  • throw

    throw 는 통해서 에러를 발생할 수 있으며 throw 의 인자가 catch 로 파라미터로 넘어갑니다.

    function* fruits() {
      try {
        yield "apple";
        yield "banana";
        yield "melon";
        yield "strawberry";
      } catch (e) {
        console.log("catch 실행");
        console.log(e);
      }
    }
    
    const fruitGenerator = fruits();
    
    console.log(fruitGenerator.next());
    console.log(fruitGenerator.throw("throw 실행"));
    /*
    { value: 'apple', done: false }
    catch 실행
    return 실행
    { value: undefined, done: true }
    */
    

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

[ES6] Symbol  (0) 2020.01.05
[ES6] proxy  (0) 2020.01.05
[ES6] Class의 상속, super, this  (0) 2020.01.04
[ES6] Async and Await  (0) 2020.01.03
[ES6] Promises - then, catch, all, race, finally  (1) 2020.01.03
Comments