[JS] π μ λλ μ΄ν° - μ΄ν°λ μ΄ν° κ°νν
μ λ€λ μ΄ν°λ?
μ΄ν°λ¬λΈμ΄λ©° λμμ μ΄ν°λ μ΄ν°
= μ΄ν°λ μ΄ν°λ₯Ό 리ν΄νλ ν¨μ
(asyncκ° Promiseλ₯Ό 리ν΄νλ ν¨μλ―μ΄, μ λλ μ΄ν°λ μ΄ν°λ μ΄ν°λ₯Ό 리ν΄νλ ν¨μλ€.)
β
μ λλ μ΄ν° ν¨μλ₯Ό μ¬μ©νλ©΄ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μν΄ μ΄ν°λ¬λΈμ μμ±νλ λ°©μλ³΄λ€ κ°νΈνκ² κ΅¬νν μ μλ€.
(Promiseμ async κ΄κ³μ λΉμ·νκ² λ³΄λ©΄ λλ€.)
β
β
μ΄ν°λ¬λΈ νλ‘ν μ½ λ°©μ
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
return {
current: this.from,
last: this.to,
next() {
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
}
};
// {from: 1, to: 5, Symbol(Symbol.iterator): ƒ}
// μ΄ κ°μ²΄λ μΈμλ₯Ό from, to λκ° κ°μ§κ³ μλ κ·Έλ₯ κ°μ²΄κ° μλλΌ,
// μ΄ν°λ μ΄ν°κ° μ μ©λ νΉμν κ°μ²΄μ΄λ€. μ΄ κ°μ²΄λ₯Ό μ κ°μ°μ°μ ν κ²½μ° μνλμ΄ λνλκ²λλ€.
alert([...range]); // 1,2,3,4,5
β
μ λλ μ΄ν° λ°©μ 1 (function μμ *μ λΆμΈλ€.)
const range = function* () { //μ λλ μ΄ν° μ§μ ν΄μ£Όλ©΄ μ μμ²΄κ° μ΄ν°λ μ΄ν°λ₯Ό λ°νν΄μ€λ€.
let i = 1;
while(true){ //μ΄μ°¨νΌ μμ yieldμ μν΄μ μ½λκ° λ©μΆλ 무ν루ν ν΄μ€μ μν λ μ§νμ μ΄μ΄λκ°μ μκ² νλ€
if (i <= 5)
yield ++i; /* yieldλ₯Ό λ§λλ©΄ μΌμμ μ§λκ³ , κ°μ 건λ€μ€λ€. κ·Έλ¦¬κ³ for..ofμ μν΄μ next()
κ° νΈμΆλλ©΄ ν¨μ μ€νμ μ΄μ΄ λκ°λ€.
μ΄ν°λ¬λΈ μΌκ²½μ° next()λ₯Ό μ μνκ³ μμ 리ν΄κ°μ {value:,donw:}μ μΌμΌν
μ μ ν΄μ€μΌ νλλ°, μ λλ μ΄ν°λ yieldλ‘ νμΉ μ μλ€. */
else
return;
}
};
for(let i of range()){
console.log(i); // 1,2,3,4,5
}
β
μ λλ μ΄ν° λ°©μ 2 (μ¬λ³Ό μ΄ν°λ μ΄ν° λ©μλμ νλ°© μ 리)
let range = {
from: 1,
to: 5,
*[Symbol.iterator]() { // [Symbol.iterator]: function*()λ₯Ό μ§§κ² μ€μ
for(let value = this.from; value <= this.to; value++) {
yield value;
}
}
};
alert( [...range] ); // 1, 2, 3, 4, 5
μ λλ μ΄ν° μ μ
μ λλ μ΄ν° ν¨μλ μΌλ° ν¨μμλ λ€λ₯Έ λ νΉν λμμ νλ€.
μ λλ μ΄ν° ν¨μλ, μΌλ° ν¨μ μ²λΌ ν¨μμ μ½λ λΈλ‘μ ν λ²μ μ€ννμ§ μκ³ ν¨μ μ½λ λΈλ‘μ μ€νμ μΌμ μ€μ§νλ€κ° νμν μμ μ μ¬μμν μ μλ νΉμν ν¨μμ΄λ€.
// μ λλ μ΄ν° ν¨μ μ μΈμ
function* genDecFunc() {
yield 1;
}
let generatorObj = genDecFunc(); // μ λλ μ΄ν° ν¨μ μ€ν κ²°κ³Ό λ°νλ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ³μμ λ£μ΄ μ¬μ©νλ€.
// μ λλ μ΄ν° ν¨μ ννμ
const genExpFunc = function* () {
yield 1;
};
generatorObj = genExpFunc();
// μ λλ μ΄ν° λ©μλ μ
const obj = {
* generatorObjMethod() {
yield 1;
}
};
generatorObj = obj.generatorObjMethod();
// μ λλ μ΄ν° ν΄λμ€ λ©μλ μ
class MyClass {
* generatorClsMethod() {
yield 1;
}
}
const myClass = new MyClass();
generatorObj = myClass.generatorClsMethod();
β
yield / next
yieldλ μ λλ μ΄ν° ν¨μμ μ€νμ μΌμμ μΌλ‘ μ μ§μν€λ©°, yield λ€μ μ€λ ννμμ μ λλ μ΄ν°μ callerμκ² λ°νλλ€.
next λ©μλλ { value, done } νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
μ¦, value νλ‘νΌν°λ yield λ¬Έμ΄ λ°νν κ°μ΄κ³ done νλ‘νΌν°λ μ λλ μ΄ν° ν¨μ λ΄μ λͺ¨λ yield λ¬Έμ΄ μ€νλμλμ§λ₯Ό λνλ΄λ boolean νμ μ κ°μ΄λ€.
λ§μ§λ§ yield λ¬ΈκΉμ§ μ€νλ μνμμ next λ©μλλ₯Ό νΈμΆνλ©΄ done νλ‘νΌν° κ°μ trueκ° λλ€.
function* generateSequence(){
...μ½λ
yield 1; // 첫λ²μ§Έ νΈμΆ μμ μ΄ μ§μ κΉμ§ μ€νλλ€.
...μ½λ
yield 2; // λλ²μ§Έ νΈμΆ μμ μ΄ μ§μ κΉμ§ μ€νλλ€.
return 3;
}
// μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€.
// μ λλ μ΄ν° κ°μ²΄λ μ΄ν°λ¬λΈμ΄λ©° λμμ μ΄ν°λ μ΄ν°μ΄λ€.
// λ°λΌμ Symbol.iterator λ©μλλ‘ μ΄ν°λ μ΄ν°λ₯Ό λ³λ μμ±ν νμκ° μλ€
let iter = gen();
//μ€ν κ²°κ³Όκ° μκΈ° μμ μΈ Sysmbol.iteratorλ₯Ό κ°μ§κ³ μλ€.
console.log(iter[Symbol.iterator]() == iter) // true
//value, done μ΄ μλ κ°μ²΄λ₯Ό λ°ννλ nextλ₯Ό νΈμΆνλ©΄ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό λ°ννκ³ ν¨μλ μΌμμ€λ¨ λλ€.
console.log(iter.next()); // { "value": 1, "done": false } + ν¨μ μ€ν μ€λ¨
console.log(iter.next()); // { "value": 2, "done": false } + ν¨μ μ€ν μ€λ¨
console.log(iter.next()); // { "value": 3, "done": true } + μν μ’
λ£
β μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ€. κ·Όλ° μ λλ μ΄ν° κ°μ²΄λ μ΄ν°λ¬λΈμ΄λ©° λμμ μ΄ν°λ μ΄ν°μ΄λ€. λ°λ‘ Symbol.iterator νΈμΆ μμ μμ΄ μ΄ν°λ μ΄ν°λ‘ μΉλΆλλκΉ Symbol.iterator λ©μλλ‘ μ΄ν°λ μ΄ν°λ₯Ό λ³λ μμ±ν νμκ° μλ€
β μ λλ μ΄ν°λ μ yieldλ₯Ό ν΅νμ¬ λͺ λ²μ next λ₯Ό ν΅ν΄ κ°μ κΊΌλΌ μ μλμ§ μ ν μ μλ€.
β next()ν¨μκ° μ€νλλ©΄ yield μμλλ‘ μ€νλκ³ μΌμ μ€λ¨λλ€.
- start -> generatorObj.next() -> yield 1 -> generatorObj.next() -> yield 2 -> ... -> end
β μ λλ μ΄ν°μ μ€ν κ²°κ³Όκ° μ΄ν°λ μ΄μ΄ν°μ΄κΈ° λλ¬Έμ for..of μμ μ¬μ© κ°λ₯νλ€.
- λ¨, next()λ₯Ό ν΅ν΄ μνκ° λλλ©΄ for..ofμμ μμ°νλ€.
- κ·Έλ¦¬κ³ nextμλ λ¬λ¦¬ for..ofμμ νΈμΆμμλ returnμ κ°μ μ°νμ§ μλλ€.
β returnμ νλ©΄ 리ν΄κ°μ valueμ ν¨κ» doneμ΄ trueκ° λλ©΄μ μνλ₯Ό μ’ λ£ νλ€.
β
β
yield* (μ λλ μ΄ν° μ»΄ν¬μ§μ )
βλ€μκ³Ό κ°μ μ λλ μ΄ν° ν¨μλ₯Ό μμ±νλ € νλ€.
μ²μμ μ«μ 0λΆν° 9κΉμ§λ₯Ό μμ±ν©λλ€(λ¬Έμ μ½λ 48λΆν° 57κΉμ§), μ΄μ΄μ μνλ²³ λλ¬Έμ AλΆν° ZκΉμ§λ₯Ό μμ±ν©λλ€(λ¬Έμ μ½λ 65λΆν° 90κΉμ§). μ΄μ΄μ μνλ²³ μλ¬Έμ aλΆν° zκΉμ§λ₯Ό μμ±ν©λλ€(λ¬Έμ μ½λ 97λΆν° 122κΉμ§). |
μΌλ°μ μΈ forλ¬Έμ μ¬μ©ν ꡬνλ°©λ²μ΄λ€.
function* generateAlphaNum() {
for (let i = 48; i <= 57; i++)
yield i; // 0123456789
for (let i = 65; i <= 90; i++)
yield i; // ABCDEFGHIJKLMNOPQRSTUVWXYZ
for (let i = 97; i <= 122; i++)
yield i; // abcdefghijklmnopqrstuvwxyz
}
let str = '';
for(let code of generateAlphaNum()) {
str += String.fromCharCode(code);
}
alert(str); // 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
β
νμ§λ§ μ λλ μ΄ν°μ νΉμ λ¬Έλ² yield*λ₯Ό μ¬μ©νλ©΄ μ λλ μ΄ν°λ₯Ό λ€λ₯Έ μ λλ μ΄ν°μ ‘λΌμ λ£μ μ’ μλ€.
yieldμ *λ₯Ό λΆμ¬ μ¬μ©νκ² λλ©΄, yield*μ ν¨κ» ννλ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό μννκ² λλ€.
function* generateSequence(start, end) { // μμκ³Ό λμ μ ν΄μ μννλ μ λλ μ΄ν°
for (let i = start; i <= end; i++)
yield i;
}
function* generatePasswordCodes() {
/* μ λλ μ΄ν° ν¨μλ₯Ό μ€νν λ λ³΄ν΅ let a = generateSequence(48, 57);
λ³μμλ€ λκ³ , a.next()λ₯Ό ν΅ν΄ μννλ€.
νμ§λ§ yield* μ λ°λ‘ μνκ° κ°λ₯νλ€.
μ΄λ λ§μΉ λΉλκΈ° ννΈμμ Promise().then()λ³΄λ€ await Promise() μ°λ 격과 λΉμ·νλ€κ³ 보면 λλ€.
*/
// 0..9
yield* generateSequence(48, 57); // generateSequence()ν¨μμ 리ν΄κ°μ μ λλ μ΄ν° κ°μ²΄μ΄λ€. yield*λ μ λλ μ΄ν° κ°μ²΄λ₯Ό μ μνμν¨λ€.
// A..Z
yield* generateSequence(65, 90);
// a..z
yield* generateSequence(97, 122);
}
let str = '';
for(let code of generatePasswordCodes()) {
str += String.fromCharCode(code);
}
alert(str); // 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
β
+ μΆκ°)
function* innerGenerator() {
yield* ['a', 'b', 'c'];
}
function* generator() {
yield [1, 2, 3]; // κ·Έλ₯ yield νλ©΄ λ°°μ΄ μ체λ₯Ό μ€λ€.
yield* [4, 5, 6]; // yield*λ λ°μ κ°μ΄ μ΄ν°λ μ΄ν° κ°μ²΄μΌκ²½μ° μννλ€. μ¦, λ°°μ΄μ νμ΄μ μννλ€.
yield* innerGenerator();
}
[...generator()];
// [[1, 2, 3], 4, 5, 6, 'a', 'b', 'c']
function* iterableYield() {
const a = 1;
yield a;
yield* [1, 2, 3].map(el => el * (10 ** a)); // κ²°κ³ΌμΈ λ°°μ΄μ μμ²΄κ° μ΄ν°λ¬λΈ κ°μ²΄μ΄λ€.
const b = 2;
yield b;
yield* [1, 2, 3].map(el => el * (10 ** b));
const c = 3;
yield c;
yield* [1, 2, 3].map(el => el * (10 ** c));
}
function run(gen) {
const it = gen();
(function iterate({ value, done }) {
console.log({ value, done });
if (done) {
return value;
}
iterate(it.next(value)); // μ¬κ·λ‘ next()λ₯Ό λ°λ³΅
})(it.next());
}
run(iterableYield);
// { value: 1, done: false }
// { value: 10, done: false }
// { value: 20, done: false }
// { value: 30, done: false }
// { value: 2, done: false }
// { value: 100, done: false }
// { value: 200, done: false }
// { value: 300, done: false }
// { value: 3, done: false }
// { value: 1000, done: false }
// { value: 2000, done: false }
// { value: 3000, done: false }
// { value: undefined, done: true }
next(μΈμκ°) μ λ¬νκΈ°
μλ μμμμλ nextκ° μΈμκ°κ³Ό ν¨κ» νΈμΆ λμλ€.
첫 λ²μ§Έ νΈμΆμ΄ μ무κ²λ μΆλ ₯νμ§ μμ κ²μ Generatorκ° μμ§ μλ¬΄λ° κ°λ yield νμ§μμκΈ° λλ¬Έμ΄λ€.
(λ λ²μ§Έ νΈμΆκ³Ό ν¨κ» μ λ¬λ μ μ 2λ Generator λ΄λΆμ yield ν€μλμ μ λ¬λμ΄ valueλ‘ ν λΉλμκ³ console.logλ‘ μΆλ ₯λμλ€)
function* gen() {
while(true) {
var value = yield null; // nullκ°μ 보λ΄κ³ , next(μΈμκ°)μ ν΅ν΄ κ°μ λ°λλ€.
console.log(value);
}
}
var g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// "{ value: null, done: false }"
// 2
... μ κ°μ°μ°μ μ λλ μ΄ν°
spreadλ¬Έλ²μ μ΄ν°λ¬λΈ κ°μ²΄μ νν΄μ μλνλ€.
μ λλ μ΄ν°λ μ΄ν°λ¬λΈμ μ΄ν°λ μ΄ν°λΌμ μ΄ μμ μ μ©μ΄ κ°λ₯νλ€.
μ κ°μ°μ°μλ₯Ό μ΄μ©νλ©΄ κ΅³μ΄ λ³μμ λ£κ³ , next()λ₯Ό λ°λ³΅λ¬Έ ν νμμμ΄ λ°λ‘λ°λ‘ νΌμ³μ μμκ°λ€μ΄ μν λμ΄ λλ€.
function* generateName() {
yield 'W';
yield 'O';
yield 'N';
yield 'I';
yield 'S';
yield 'M';
}
// for..of
const genForForOf = generateName();
for (let i of genForForOf) {
console.log(i);
}
// 'W'
// 'O'
// 'N'
// 'I'
// 'S'
// 'M'
// ...Spread
const genForSpread = generateName();
console.log([...genForSpread]); // ['W', 'O', 'N', 'I', 'S', 'M']
μ λλ μ΄ν° μ’ λ£
μ λλ μ΄ν°μλ next μΈμλ throw, return λ±μ λ©μλκ° μλλ°, μ΄ returnκ³Ό throwλ₯Ό ν΅ν΄ μ λλ μ΄ν°λ₯Ό μ’ λ£ν μ μλ€. λ€λ§, μ΄ λμ μ‘°κΈμ μ°¨μ΄κ° μλ€.
β
[return]
function* increment() {
let i = 0;
try {
while (true) {
yield i++;
}
} catch (e) {
console.log('[ERROR]', e);
}
}
const withReturn = increment();
console.log(withReturn.next()); // { value: 0, done: false } : i++ λΌμ 0λΆν° μ°νλ€.
console.log(withReturn.next()); // { value: 1, done: false }
console.log(withReturn.next()); // { value: 2, done: false }
console.log(withReturn.next()); // { value: 3, done: false }
console.log(withReturn.return(42)); // { value: 42, done: true }
returnμ΄ νΈμΆλκ³ λλ©΄, valueμλ returnμ μΈμκ° ν λΉλκ³ , doneμ trueκ° λλ€.
β
β
[throw]
const withThrow = increment();
console.log(withThrow.next());
console.log(withThrow.next());
console.log(withThrow.next());
console.log(withThrow.next()); // { value: 3, done: false }
console.log(withThrow.throw(-1)); // Uncaught -1
throwκ° νΈμΆλκ³ λλ©΄, catch λΈλ‘μ throwμ μΈμκ° μ λ¬λλ€.
μ€μ ) μ§μ° νκ°μ μ₯μ
1λΆν° 99κΉμ§ μνν μ μλ λ°λ³΅μλ₯Ό λ§λ€μ΄ 보μ.
β
λ¨Όμ λ°°μ΄μ λ§λλ λ°©λ²μ,
function newArr(n) {
let i = 1;
const res = [];
while (i < n)
res.push(i++);
return res;
}
const arr = newArr(100);
console.log(arr); // [1,2,3 ... 99, 100]
β
μ λλ μ΄ν°λ‘ λ§λλ λ°©λ²μ,
function* newArrGen(n) {
let i = 1;
while (i < n)
yield i++;
}
const iter = newArrGen(100);
console.log(iter);
β
μ΄μ μμ λ ν¨μλ₯Ό κ°μ§κ³ λ§λ€μ΄μ§ λ°λ³΅ κ°λ₯ν κ°μ²΄λ‘ 5μ λ°°μλ₯Ό μμ μλΆν° 2κ°λ§ μ°Ύλλ‘ κ΅¬νν΄λ³΄μ
function fiveArr(iter) {
const res = [];
for (const item of iter) {
if (item % 5 == 0)
res.push(item);
else if (res.length == 2)
break;
}
return res;
}
console.log(fiveArr(newArr(100)));
console.log(fiveArr(newArrGen(100)));
/*
μ€ν κ²°κ³Ό
[ 5, 10 ]
[ 5, 10 ]
*/
κ°μ κ²°κ³Όλ₯Ό λ§λ€μ΄λΈλ€.
λ°°μ΄μ λ§λ€μ΄ λ£μ΄ λ리λ , μ λλ μ΄ν°λ‘ λ리λ λκ°μ μνλ₯Ό νλ κ²μ΄λ€.
β
νμ§λ§ μ λλ μ΄ν°λ₯Ό νμ©ν μ½λλ μ’ λ λΉ λ₯΄κ² λμνλ€.
μ΄ μ°¨μ΄κ° μ¦μ νκ°μ μ§μ° νκ°μΈλ°,
fiveArr(newArr(100))
μ½λλ newArr ν¨μκ° λ°°μ΄μ μ¦μ λ§λ€μ΄λΈλ€. (1~99κΉμ§) λ§λ€μ΄μ§ λ°°μ΄μ 리ν΄ν΄μ fiveArr ν¨μλ₯Ό μννκ² λλ€.
μ½κ² λ§ν΄ fiveArr([1, 2, 3, 4, 5, 6, ..., 97, 98, 99]) λλ€λ κ²μ΄λ€.
β
fiveArr(newArrGen(100))
μ½λλ newArrGen ν¨μκ° μ΄ν°λ μ΄ν°λ§ λ§λ€μ΄λ΄κ³ fiveArr ν¨μμμ νμν λ μ΄ν°λ μ΄ν°μμ νκ°λ κ°μ μ¬μ©νκ² λλ€.
κ·Ήλ¨μ μΌλ‘ ν¬κΈ°λ₯Ό μ¬λ €μ μκ°μ λΉκ΅ν΄λ³΄μ.
console.time('');
console.log(fiveArr(newArr(10000000))); // [ 5, 10 ]
console.timeEnd(''); // : 285.535ms
console.time('');
console.log(fiveArr(newArrGen(10000000))); // [ 5, 10 ]
console.timeEnd(''); // : 7.296ms
μ΄λ§μ΄λ§ν ν¬κΈ°μ λ°λ³΅ κ°λ₯ν κ°μ²΄λ₯Ό λ§λ λ€μμ fiveArr ν¨μλ₯Ό μ€ννλ λͺ¨μ΅μ΄λ€.
κ·Έλ¬λ μ¦μ νκ°μ λ¬λ¦¬ μ§μ° νκ°λ νμ€ν λΉ λ₯΄κ² λμνλ κ²μ λ³Ό μ μλ€.
λν, κ°μ΄ νμν λ μ΄ν°λ μ΄ν°μμ κΊΌλ΄ μ°λ―λ‘ λ¬΄νλλ‘ μ΄ν°λ μ΄ν°λ₯Ό λ§λ€μ΄λ κ²°κ³Όλ κ°λ€.
console.time('');
console.log(fiveArr(newArrGen(Infinity))); // [ 5, 10 ]
console.timeEnd(''); // : 7.441ms
μ λλ μ΄ν° λΉλκΈ° μ²λ¦¬
const fetch = require('node-fetch');
function getUser(genObj, username) {
fetch(`https://api.github.com/users/${username}`)
.then(res => res.json())
// β μ λλ μ΄ν° κ°μ²΄μ λΉλκΈ° μ²λ¦¬ κ²°κ³Όλ₯Ό μ λ¬νλ€.
.then(user => genObj.next(user.name));
}
// μ λλ μ΄ν° κ°μ²΄ νλ°© μμ±
const g = (function* () {
let user;
// β‘ λΉλκΈ° μ²λ¦¬ ν¨μκ° κ²°κ³Όλ₯Ό λ°ννλ€.
// λΉλκΈ° μ²λ¦¬μ μμκ° λ³΄μ₯λλ€.
user = yield getUser(g, 'jeresig'); // genObj.next(user.name)μ μν΄μ μ μ μ΄λ¦μ΄ λ°νλλ€.
console.log(user); // John Resig
user = yield getUser(g, 'ahejlsberg');
console.log(user); // Anders Hejlsberg
user = yield getUser(g, 'ungmo2');
console.log(user); // Ungmo Lee
}());
// μ λλ μ΄ν° ν¨μ μμ
g.next();
- κ΅μ₯ν 볡μ‘ν΄ λ³΄μ΄μ§λ©΄ λ³κ±°μλ€. μ°¨λ‘λλ‘ ν΄λ³΄μ.
- μ°μ λ³μ gμ μ λλ μ΄ν° ν¨μ μ¦μμ€νμΌλ‘, λ°νκ° μ λλ μ΄ν° κ°μ²΄λ₯Ό λ°μλ€. μ¦ λ³μ gλ μ λλ μ΄ν° κ°μ²΄.
- g.next()λ₯Ό ν΅ν΄ μνλ₯Ό μμνλ€. κ·Έλ¬λ©΄ 첫 yieldλ‘ κ°λ€
- μ΄ μ²« yieldμμ getUser()ν¨μλ₯Ό μ€ννλ€. μΈμλ‘ call by referenceλ‘ gκ°μ²΄λ₯Ό μ λ¬νλ€.
- getUser()ν¨μμμ fetchλ κ²°κ³Όλ‘ genObj.next(μΈμκ°)μ΄ μ€νλλ€. nextμ κ°μ΄ μμΌλ, λ°νκ°μΌλ‘ λ³μ userμ μΈμκ°μ΄ λ€μ΄κ°κ² λλ€.
- μ΄λ₯Ό λ°λ³΅νλ€.
κ·Έλ₯ async / await μ°λ©΄ κ°λ¨νκ² κ΅¬νν μμλ€.
*μμ½*
βμ λλ μ΄ν° λ리기 μν 3κ°μ§ λ°©λ².
- μ λλ μ΄ν° ν¨μ λ°νκ°([Symbol.iterator]())μ λ°μμ νλμ© next() νλλ²
- μ λλ μ΄ν° ν¨μλ₯Ό for..ofλ¬ΈμΌλ‘ λ리λ λ°©λ²
- μ λλ μ΄ν° ν¨μλ₯Ό [...] spreadλ¬Έλ²μ¨μ νΌμΉλ λ²
Reference
https://mygumi.tistory.com/370
https://poiemaweb.com/es6-generator
https://wonism.github.io/javascript-generator/
https://bbaktaeho-95.tistory.com/80
β