์ผ๋ฐ ํจ์๋ ํ๋์ ๊ฐ(ํน์ return ๊ฐ์ด ์์ ์๋ ์์)๋ง์ ๋ฐํ.
but.
์ ๋๋ ์ดํฐ(generator)๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ํ์์ ๋ฐ๋ผ ํ๋์ฉ ๋ฐํ(yield)ํ ์ ์๊ฒ ๋๋ค.
generator๊ณผ iterable ๊ฐ์ฒด๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์์ฝ๊ฒ data stream์ ๋ง๋ค ์ ์๋ค๊ณ ํจ.
* ์ดํฐ๋ฌ๋ธ(iterable)
- ๋ฐ๋ณต ๊ฐ๋ฅํ(iterable, ์ดํฐ๋ฌ๋ธ) ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ผ๋ฐํํ ๊ฐ์ฒด. ์ดํฐ๋ฌ๋ธ์ด๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ๊ฐ์ฒด์๋ for..of ๋ฐ๋ณต๋ฌธ์ ์ ์ฉํ ์ ์๋ค.
- ๋ฐฐ์ด์ด ๋ํ์ ์ธ ์ดํฐ๋ฌ๋ธ์. ๋ฐฐ์ด ์ธ์๋ ๋ค์์ ๋ด์ฅ ๊ฐ์ฒด์ ๋ฐ๋ณต๋ ๊ฐ๋ฅ.
[ ์ดํฐ๋ ์ดํฐ iterator : obj[Sysbol.iterator]์ ๊ฒฐ๊ณผ. ์ด์ด์ง๋ ๋ฐ๋ณต ๊ณผ์ ์ ์ฒ๋ฆฌํ๋ค. ]
** ์ดํฐ๋ฌ๋ธ ๊ท์ฝ
for..of ๋ฐ๋ณต ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด(๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด)๋ฅผ ๋ฐ๋ณตํ ๋ ๊ฐ์ด ์ด๊ฑฐ๋๊ณ ๋ด๋ถ์๋ @@iterator ๋ฉ์๋๊ฐ ๊ทธ๊ตฌํ๋์ด ์์ด์ผ ํจ.
Sysbol.iterator() == @@iterator
์๋ฐ ์คํฌ๋ฆฝํธ์ ๋ด์ฅ ๊ฐ์ฒด์ธ Array, String, Map, Set, Arguments ๋ฑ์ด ์ด ์ดํฐ๋ฌ๋ธ ๊ท์ฝ์ ๋ฐ๋ฅธ๋ค.
์ ๋๋ ์ดํฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด '์ ๋๋ ์ดํฐ ํจ์'๋ผ๊ณ ๋ถ๋ฆฌ๋ ํน๋ณํ ๋ฌธ๋ฒ ๊ตฌ์กฐ์ธ function* ์ด ํ์ํ๋ฐ..
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
ํ์์ผ๋ก ์ ์ธํ๊ณ , ํ๋์ฉ ๊ฐ์ ๋ถ๋ฌ์ค๊ธฐ ์ํด์๋
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}
์ด๋ฐ ์์ผ๋ก JSON.stringify() ๋ฌธ๋ฒ์ ์ฌ์ฉํด๋ณด๋๋ก ํ์.
์ ์ํ ๋์๋ yield / ๊ฐ์ ์ป์ด์ฌ ๋์๋ next , return , throw
1. next : ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ง๋ค, "์๋ก์ด yield"์ ๊ฐ๊ณผ "์์ผ๋ก yieldํ ๊ฐ์ด ๋ ๋จ์๋์ง์ ์ฌ๋ถ"๋ฅผ ๋ฐํ.
{value: ,done: false/true} ์ ํํ๋ก ๊ฐ ๋ฐํ
2. return : ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ ๋ฐํํ๊ณ ์ ๋๋ ์ดํฐ๋ฅผ ์ข ๋ฃ.
{value: ์ธ์, done:true} ๋ฅผ ๋ฐํ
3. throw: ์ธ์๋ก ์ ๋ฌ๋ฐ์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ์ ๋๋ ์ดํฐ๋ฅผ ์ข ๋ฃ.
- ์ฌ๊ธฐ์ ๊ทธ๋ฅ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถฐ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ try~catch ๋ฌธ์ผ๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
function* fun(){
console.log('์ ๋๋ ์ดํฐ fun ์คํ');
try{
yield 1;
yield 2;
yield 3;
} catch(e) {
console.error(e);
}
}
const f= fun();
console.log(f.next());
console.log(f.throw('error message test');
console.log(f.next());
> {value: 1, done:false}
> error message test
> {value: undefined, done:true}
> {value: undefined, done: true}
======
์ ๋๋ ์ดํฐ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด, ์ดํฐ๋ฌ๋ธ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ฐ ํนํ ๋ฌดํ๋ฃจํ์์ ๅค ํ์ฉ..
- ๋ฌดํ์์ด, ๋ฌดํ ์คํฌ๋กค ๋ฑ.. ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋
const fibonacci = (function* () {
let[pre, cur] = [0,1];
while(true) {
[pre, cur] = [cur, pre+cur];
yield pre;
}
})();
for (const num of fibonacci) {
if (num>1000) break;
console.log(num);
}
์ด๋ฐ ํจํด์ด ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ๋ชจํด๋๋ฉด ์ข๋ค๊ณ ํ๋ค. feat. ํผ๋ณด๋์น ์์ด..
[ ์ฐธ๊ณ ]
https://blog.naver.com/tombyun/222444048304
https://ko.javascript.info/generators