Generator & yield | yield* | return
λͺ¨λ ν¬μ€ν μ μΈνλ° ECMAScript6: λΉ λ₯΄κ² λ°°μ°λ ES6 μ€ν¬κ³Ό λΉλκΈ° νλ‘κ·Έλ¨ μ λ΄μ©μ λ΄κ³ μμΌλ©°
μΆμ²λ μλμ μ£Όμλ‘ "κΉνν"λμ μλ£μ λλ€.
μμ μ μΈ μλκ° μλ 곡λΆν κ²μ μ 리ν΄λλ λͺ©μ μΌλ‘ ν¬μ€ν ν κ²μ λλ€.
www.inflearn.com/course/es6-ecmascript-6
ECMAScript 6: λΉ λ₯΄κ² λ°°μ°λ ES6 μ€ν¬κ³Ό λΉλκΈ° νλ‘κ·Έλλ° - μΈνλ°
λΉλκΈ° νκ²½μμ μ½κ² μ½λλ₯Ό μμ±ν μ μλλ‘ ES6μ μλ‘μ΄ κΈ°λ₯μ λν΄ λ°°μ°κ³ μλ°μ€ν¬λ¦½νΈ μ€ν¬μ ν₯μμμΌ λ³΄μΈμ. μ΄κΈ νλ‘κ·Έλλ° μΈμ΄ ES6 μ¨λΌμΈ κ°μ abcdefghijk
www.inflearn.com
1. Generator & yieId
# Generator
funtion* ν€μλλ‘ μ μνλ μ λλ μ΄ν° ν¨μλ Generator κ°μ²΄λ₯Ό λ°ννλ€.
Generator κ°μ²΄λ iterableν Iteratorκ°μ²΄μ΄λ€.(μν κ°λ₯ν)
ν¨μμ λ λΆλΆκΉμ§ λͺ¨λ μνλ μ΄ν, generatorν¨μμμ returnμ μ¬μ©, μλ¬ λ°μ
μ μΈκ°μ§μ κ²½μ° μ’ λ£λλ€.
μ΄ κ°μ²΄λ μΌμμ μ§μ μ¬μμ κΈ°λ₯μ μ¬μ©ν μ μλ€. μ½λλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ.
function* intro(name){
yield name + " λ μλ
νμΈμ";
yield "APPle μ§μμ μ€μ κ²μ νμν©λλ€";
yield "λμμ΄ νμνλ€λ©΄ μΈμ λ λ¬Έμ μ£ΌμΈμ";
yield "λ°μ΄λ°μ΄";
}
μμ κ°μ ν¨μλ₯Ό μ λλ μ΄ν° ν¨μλΌκ³ λΆλ₯Έλ€.
μΌλ° ν¨μμ μ λλ μ΄ν° ν¨μκ° λ€λ₯Έμ μ functionλ€μ μμ€ν¬λ¦¬μ€νΈ μ¦ (" * ")λ³ν λͺ¨μμ΄ λΆμ ννμ ν€μλλ‘ μμλλ€λ κ²μ΄λ€.
# yield
μ λλ μ΄ν° ν¨μμλ yieldν€μλκ° μ‘΄μ¬νλ€.
yieldꡬ문μ λ¬Έλ²μ returnλ¬Έκ³Ό λΉμ·νμ§λ§, μ λλ μ΄ν°μ μ€νμ λ©μ·λ€κ° λ€μμ λ€μ μ΄μ΄μ μμνλ€λ μ μμ μ°¨μ΄λ₯Ό 보μΈλ€.
μ΄μ ν¨μλ₯Ό νΈμΆν΄λ³΄μ.
function* intro(name){
console.log("νμν©λλ€.");
yield name + " λ μλ
νμΈμ";
yield "APPle μ§μμ μ€μ κ²μ νμν©λλ€";
yield "λμμ΄ νμνλ€λ©΄ μΈμ λ λ¬Έμ μ£ΌμΈμ";
yield "λ°μ΄λ°μ΄";
}
let iter = intro("haeun");
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
κ²°κ³Όλ μλμ κ°λ€.
μ λλ μ΄ν° ν¨μλ₯Ό νΈμΆνλ©΄ λ©μΆ°μ§ μ λλ μ΄ν° κ°μ²΄λ₯Ό 리ν΄νλ€.
μ¬κΈ°μ 리ν΄λ μ λλ μ΄ν° κ°μ²΄λ μ΄ν°λ μ΄ν°(λ°λ³΅μ) μ΄λ©°, μ΄κ²μ haeunμ κ°λ₯΄ν¨λ€.
> offbyone.tistory.com/83 λ¬Έλ²λ§ μ΅νκΈ°μ μ μ¬μ΄νΈλ₯Ό μ°Έκ³ ν΄λ μ’μ κ² κ°λ€.
μ΄ν°λ μ΄ν°(λ°λ³΅μ)λ next()λ©μλλ₯Ό κ°μ§κ³ μλ€.
μ λλ μ΄ν° κ°μ²΄μ next()λ©μλλ₯Ό νΈμΆν λ λ§λ€ μ€νμ μ¬κ° ν΄ yieldꡬ문κΉμ§ μ€νμ΄ λκ³ , λ€μ μ€μ€λ‘ μ€νμ λ©μΆλ€.
λ€μμ next λ©μλκ° μ€νλλ©΄ λλ²μ§Έ yieldꡬ문μ μ€ννκ³ λ€μ, κ·Έ μ΄νλΆν° μ€νμ μ¬κ° νλ€
μ λλ μ΄ν°μ λ°λ³΅μ΄ λλλ μμ μ 3κ°μ§ κ²½μ°κ° μλ€.
- ν¨μμ λ λΆλΆκΉμ§ λͺ¨λ μ€νλ κ²½μ°
- μ λλ μ΄ν° ν¨μμμ return μ¬μ©
- μλ¬κ° λ°μνλ κ²½μ°
2. yieId *
# μ½λ μ€μ΅
function* mymy(){
yield* [1,2,3,4,5,6,7];
yield 8;
yield 9;
}
let iterator = mymy();
for(const n of iterator){
console.log(n);
}
κ²°κ³Όλ μλμ κ°λ€.
yield valueλ₯Ό μ¬μ©νλ©΄ νκ°μ§ κ°μ λ°νν μ μκ³ , λ€μκ³Ό κ°μ΄ yieldμ λ³μ΄ λΆμ ννμ μ΄ν°λ¬λΈμ μ¬μ©νλ©΄ ν΄λΉλλ μ΄ν°λ¬λΈ κ°μ μμ°¨μ μΌλ‘ λ°ν ν μ μλ€.
# next(value)
λ€μ κ°μ μ»λ μν μ λ©μλ, λ§€κ°λ³μλ λ°λ‘ μ΄μ μ yield[expression]μ λ°ν κ°μΌλ‘ μ¬μ©
function* foo(){
console.log(yield);
console.log(yield);
console.log(yield);
}
let fo = foo();
fo.next();
fo.next(1);
fo.next(2);
fo.next(3);
fo.next(4);
κ²°κ³Όλ λ€μκ³Ό κ°λ€.
next λ©μλλ λ€μ κ°μ μ»λ μν μ νλ©° μ΄ν°λ μ΄ν°μ nextλ©μλμ μ μ¬νμ§λ§, μ΅μ μΌλ‘ argumentλ₯Ό λ°λ λ€λ μ μ΄ λ€λ₯΄λ€.
μΌλ°μ μΈ μ΄ν°λ μ΄ν°μ next()μ λ€λ₯΄κ² μ λλ μ΄ν° κ°μ²΄μ next()λ μΈμλ₯Ό λ°μ μλ μλ€.
μ λλ μ΄ν° ν¨μκ° κ°μ μ°κ³ , μ λλ μ΄ν° κ°μ²΄μ μ΄ν°λ μ΄ν° μΈν°νμ΄μ€λ‘ κ°μ μ½λ κ² λΏλ§ μλλΌ
μ λλ μ΄ν° κ°μ²΄μ κ°μ μ°κ³ μ λλ μ΄ν° ν¨μκ° κ°μ μ½μ΄ κ° μλ μλ€.
3. return
#return(value)
λ§€κ°λ³μλ‘ μ¨ κ°μ valueλ‘ λ°ννκ³ , Generatorμ μ’ λ£
function* test(){
yield 1;
yield 2;
yield 3;
}
let t = test();
console.log(t.next());
console.log(t.return("λ©λ‘±λ©λ‘±"));
console.log(t.next());
κ²°κ³Όλ λ€μκ³Ό κ°λ€.
return λ©μλλ λ§€κ°λ³μλ‘ μ¨ κ°μ valueλ‘ λ°ννκ³ μ λλ μ΄ν°λ₯Ό μ’ λ£μν¨λ€.
κ²°κ³Όλ₯Ό 보면 returnλ©μλλ₯Ό μ¬μ©ν λΆλΆμ done: νλ‘νΌν°μ κ°μ΄ trueλ‘ μ°νμλ κ²μ λ³Ό μ μλ€.
λ°λΌμ λ€μ next()λ₯Ό νΈμΆνλ λΆλΆμμλ μ΄λ―Έ μ’ λ£λ μ λλ μ΄ν°λ₯Ό νΈμΆνλ κ²κ³Ό λ§μ°¬κ°μ§μ κ²°κ³Ό κ°μ λ°ννλ€.
# throw(exception)
μΈμλ‘ λ°μ μλ¬ λ°μμν€κ³ , generatorλ₯Ό μ’ λ£μν¨λ€.
function* generator(){
try{
yield 'foo2';
}
catch(err){
console.log(err.message);
}
}
let iterator = generator();
let foo2 = iterator.next();
console.log(foo2.value);
let nextThing = iterator.throw(new Error('bar'));
κ²°κ³Όλ μλμ κ°λ€.
throw λ©μλλ μΈμλ‘ λ°μ μλ¬λ₯Ό λ°μμν€κ³ , μ λλ μ΄ν°λ₯Ό μ’ λ£μν¨λ€.
μ λλ μ΄ν° ν¨μλ΄λΆμ catch ꡬ문μ ν΅ν΄ μ²λ¦¬ν μλ μλ€.