π Generator
ES6μμ λμ λ μ λλ μ΄ν°(Generator) ν¨μλ μ΄ν°λ¬λΈμ μμ±νλ ν¨μμ΄λ€. μ λλ μ΄ν° ν¨μλ₯Ό μ¬μ©νλ©΄ μ΄ν°λ μ΄μ νλ‘ν μ½μ
μ€μν΄ μ΄ν°λ¬λΈμ μμ±νλ λ°©μλ³΄λ€ κ°νΈνκ² μ΄ν°λ¬λΈμ ꡬνν μ μλ€. λν μ λλ μ΄ν° ν¨μλ λΉλκΈ° μ²λ¦¬μ μ μ©νκ² μ¬μ©λλ€.
μ λλ μ΄ν° ν¨μλ μΌλ° ν¨μμλ λ€λ₯Έ λ νΉν λμμ νλ€. μ λλ μ΄ν° ν¨μλ μΌλ° ν¨μμ κ°μ΄ ν¨μμ μ½λ λΈλ‘μ ν λ²μ
μ€ννμ§ μκ³ ν¨μ μ½λ λΈλ‘μ μ€νμ μΌμ μ€μ§νλ€κ° νμν μμ μ μ¬μμν μ μλ νΉμν ν¨μμ΄λ€.
μΌλ° ν¨μλ₯Ό νΈμΆνλ©΄ return λ¬ΈμΌλ‘ λ°νκ°μ 리ν΄νμ§λ§ μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ μ λλ μ΄ν°λ₯Ό λ°ννλ€.
1
2
3
4
5
6
7
8
9
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
// 'μ λλ μ΄ν° ν¨μ'λ 'μ λλ μ΄ν° κ°μ²΄'λ₯Ό μμ±ν©λλ€.
let generator = generateSequence();
alert(generator); // [object Generator]
next() λ‘ μ λ€λ μ΄ν° μ€ν κ°λ₯
1
2
3
4
5
6
7
8
9
10
11
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}
let two = generator.next();
alert(JSON.stringify(two)); // {value: 2, done: false}
let three = generator.next();
alert(JSON.stringify(three)); // {value: 3, done: true}
μ λλ μ΄ν°λ μ΄ν°λ¬λΈ(iterable)μ΄λ©΄μ λμμ μ΄ν°λ μ΄ν°(iterator)μΈ κ°μ²΄μ΄λ€.
iterator λ©μλλ₯Ό μμ ν μ΄ν°λ¬λΈμ΄λ€. κ·Έλ¦¬κ³ μ λλ μ΄ν°λ next λ©μλλ₯Ό μμ νλ©° next λ©μλλ₯Ό νΈμΆνλ©΄ value, done
νλ‘νΌν°λ₯Ό κ°λ μ΄ν°λ μ΄ν° κ°μ²΄λ₯Ό λ°ννλ μ΄ν°λ μ΄ν°μ΄λ€.
for λ‘λ μ€νλ¨
1
2
3
4
5
6
7
8
9
10
11
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
for (let value of generator) {
alert(value); // 1, 2κ° μΆλ ₯λ¨
}
μ£Όμν μ μ μ μμλ₯Ό μ€ννλ©΄ 1κ³Ό 2λ§ μΆλ ₯λκ³ 3μ μΆλ ₯λμ§ μμ
μ΄μ λ for..of μ΄ν°λ μ΄μ μ΄ done: trueμΌ λ λ§μ§λ§ valueλ₯Ό 무μνκΈ° λλ¬Έμ΄λ€.
μ λλ μ΄ν°λ μ΄ν°λ¬λΈ κ°μ²΄μ΄λ―λ‘ μ λλ μ΄ν°μλ μ κ° λ¬Έλ²(β¦) κ°μ κ΄λ ¨ κΈ°λ₯μ μ¬μ©ν μ μλ€.
1
2
3
4
5
6
7
8
9
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let sequence = [0, ...generateSequence()];
alert(sequence); // 0, 1, 2, 3