Languages/Java Script

Generator & yield | yield* | return

μ •λ³΄λ³΄μ•ˆπŸŒ 2021. 2. 15. 22:42
λ°˜μ‘ν˜•

λͺ¨λ“  ν¬μŠ€νŒ…μ€ μΈν”„λŸ° 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 ꡬ문을 톡해 μ²˜λ¦¬ν•  μˆ˜λ„ μžˆλ‹€.

 

 

 

λ°˜μ‘ν˜•