
ํจ์์ ์คํ์ ์ค๊ฐ์ ๋ฉ์ท๋ค๊ฐ ์ ๊ฐํ ์ ์๋ ๊ธฐ๋ฅ
ํจ์ ์์ *๋ฅผ ๋ฃ์ด์ ๋ง๋ค๊ณ ,
๋ด๋ถ์ yield ํค์๋๋ฅผ ๋ฃ์ด์ ์ฌ์ฉ
yield์์ ํจ์์ ์คํ์ ๋ฉ์ถ ์ ์์
function* fn() {
yield 1;
yield 2;
yield 3;
return 'finish';
}
const a =fn();
Generator๋ฅผ ์คํํ๋ฉด Generator ๊ฐ์ฒด๊ฐ ๋ฐํ
Generator ๊ฐ์ฒด๋ next method๊ฐ ์์
์ฆ, ํจ์๋ฅผ ์คํํ๋ ค๋ฉด next()๊ฐ ํ์
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();
a.next(); //1 ๊ฐ์ฅ ๊ฐ๊น์ด yield ๋ฌธ์ ๋ง๋ ๋๊น์ง ์คํ๋๊ณ ๋ฐํ
//{value:1, done: false}
๋ฐํ๋ data๊ฐ์ฒด๋ value์ done property๋ฅผ ๊ฐ์ง
value: yield ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ, ์์ผ๋ฉด undefined
done: ์ด๋ฆ ๊ทธ๋๋ก ํจ์๊ฐ ๋๋ฌ๋ ์ง ๋ํ๋ (๋๋จ: true, ์๋: false)
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();
a.next();
//{value:1, done: false}
...(๊ณ์ ์คํ)
a.next();
//{value: 'finish', done: true}
a.next();
//{value: undefined , done: true}
Generator๋ next method ์ธ์, return๊ณผ throw method๊ฐ ์์
๊ทธ ์ฆ์ done ๊ฐ์ด true
์ดํ์ next๋ฅผ ์คํํด๋ value๋ฅผ ์ป์ด์ฌ ์ ์๊ณ done์ true์
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();
a.return('END');
//{value:'END', done: true }
a.next();
//{value: undefined , done: true}
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'))
//err, {value: undefined , done: true}
Symbol.iterator ๋ฉ์๋๊ฐ ๊ตฌํ๋์ด์ผ ํจ.
๋งค์๋ ํธ์ถ์ ๊ฒฐ๊ณผ ์ฆ, Symbol.iterator๋ iterator๋ฅผ ๋ฐํํด์ผ ํ๋ค
value, done property๋ฅผ ๋ฐํํ๋ ๋งค์๋ next๊ฐ ์์ด์ผ ํจ
์ฆ, Generator=iterator=iterable
๋ฐฐ์ด ๋ํ Symbol.iterator๊ฐ ์๊ณ , next๊ฐ ์์ผ๋ฏ๋ก ๋ฐ๋ณต ๊ฐ๋ฅ!!!!
๋ฐฐ์ด= ๋ฐ๋ณต๊ฐ๋ฅํ ๊ฐ์ฒด
function* fn() {
yield 1;
yield 2;
yield 3;
}
const a =fn();
a[Symbol.iterator]() ===a;
//true
Generator์ Symbol.iterator ์คํ ๊ฐ == ์๊ธฐ ์์
Generator๋ iterable ๊ฐ์ฒด
๋ฐ๋ผ์ for of ๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
+๋ฌธ์์ด๋ iterable์
function* fn() {
const num1 = yield '์ฒซ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.';
console.log(num1);
const num2 = yield '๋๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.';
console.log(num2);
return num1+num2
}
const a =fn();
a.next()
//{value: '์ฒซ๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.', done: false}
a.next(2);
//2
//{value: ๋๋ฒ์งธ ์ซ์๋ฅผ ์
๋ ฅํด์ฃผ์ธ์.', done: false}
a.next(4);
//4
//{value: 6, done: true} ๋ ์ซ์๋ฅผ ๋ํ return ๊ฐ์ด ๋์ด
Generator๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ง ์์
๋ฐ๋ผ์ while(true)๋ฅผ ์ฌ์ฉํด์ ๋ฌดํ ๋ฐ๋ณต์ํด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ป์ง ์์
ํ์ํ ๋ถ๋ถ๋ง ์ฐ์ฐํด์ ๊ฐ์ ์ค
function* fn() {
let index = 0;
while (true) {
yield index++;
}
}
const a =fn();
a.next();
...~
Generator๋ฅผ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ๋ฌดํ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฉด ์๋จ
Generator ํ์ํ ๊ฐ๋ง ๊ทธ๋๊ทธ๋ ์์ฑํจ.
ํ์ํ ์๊ฐ๊น์ง ๊ณ์ฐ์ ๋ฏธ๋ฃฐ ์ ์์
๋ค๋ฅธ Generator ๋ถ๋ฌ ์ค๊ธฐ
๋ฐ๋ณต ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์ฌ ์ ์์
function* gen1() {
yield 'W';
yield 'o';
yield 'r';
yield 'l';
yield 'd';
}
funciton* gen2(){
yield 'Hello';
yield* gen1(); //๋ค๋ฅธ Generator ํจ์๋ฅผ ๋ถ๋ฌ์ด, ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด ๊ฐ๋ฅ!
yield '!';
}
console.log(...gen2())
Hello, W o r l d !
Generator๋ ๋ค๋ฅธ ์์ ์ ํ๋ค๊ฐ ๋ค์ ๋์์์ next()ํด์ฃผ๋ฉด
์งํ์ด ๋ฉ์ท๋ ๋ถ๋ถ๋ถํฐ ์ด์ด์ ์คํ