| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- js
- PYTHON
- 알고리즘 연습
- django ORM
- 백준
- 알고리즘 풀이
- Baekjoon
- web
- react
- AWS
- 알고리즘
- Git
- c++
- Django
- DRF
- 알고리즘 문제
- HTML
- javascript
- form
- 파이썬
- django rest framework
- API
- MAC
- es6
- 파이썬 알고리즘
- 장고
- java
- Algorithm
- CSS
- django widget
Archives
- Today
- Total
수학과의 좌충우돌 프로그래밍
[ES6] generator 본문
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() 를 통해 얻을 수 있습니다.
value 는 yield 뒤에 나온 인자값이 반환되고, done 은 generator가 아직 끝나지 않았음을 의미합니다.
console.log(fruitGenerator.next());
// { value: 'apple', done: false }
이를 반복하면 yield 가 더 이상 끝나지 않고 함수가 종료될 시점에 done 이true 로 반환합니다.
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