ì¼ë° í¨ìë íëì ê°(í¹ì 0ê°ì ê°)ë§ì ë°íí©ëë¤.
íì§ë§ ì ëë ì´í°(generator)를 ì¬ì©íë©´ ì¬ë¬ ê°ì ê°ì íìì ë°ë¼ íëì© ë°í(yield)í ì ììµëë¤. ì ëë ì´í°ì ì´í°ë¬ë¸ ê°ì²´ë¥¼ í¨ê» ì¬ì©íë©´ ìì½ê² ë°ì´í° ì¤í¸ë¦¼ì ë§ë¤ ì ììµëë¤.
ì ëë ì´í° í¨ì
ì ëë ì´í°ë¥¼ ë§ë¤ë ¤ë©´ 'ì ëë ì´í° í¨ìâë¼ ë¶ë¦¬ë í¹ë³í ë¬¸ë² êµ¬ì¡°, function*ì´ íìí©ëë¤.
ìì:
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
ì ëë ì´í° í¨ìë ì¼ë° í¨ìì ëì ë°©ìì´ ë¤ë¦ ëë¤. ì ëë ì´í° í¨ì를 í¸ì¶íë©´ ì½ëê° ì¤íëì§ ìê³ , ëì ì¤íì ì²ë¦¬íë í¹ë³ ê°ì²´, 'ì ëë ì´í° ê°ì²´âê° ë°íë©ëë¤.
ìì를 ì´í´ë´ ìë¤.
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
// 'ì ëë ì´í° í¨ì'ë 'ì ëë ì´í° ê°ì²´'를 ìì±í©ëë¤.
let generator = generateSequence();
alert(generator); // [object Generator]
í¨ì 본문 ì½ëë ìì§ ì¤íëì§ ìììµëë¤.
next()ë ì ëë ì´í°ì 주ì ë©ìëì
ëë¤. next()를 í¸ì¶íë©´ ê°ì¥ ê°ê¹ì´ yield <value>문ì ë§ë ëê¹ì§ ì¤íì´ ì§ìë©ëë¤(value를 ìëµí ìë ìëë°, ì´ ê²½ì°ì undefinedê° ë©ëë¤). ì´í, yield <value>문ì ë§ëë©´ ì¤íì´ ë©ì¶ê³ ì°ì¶íê³ ì íë ê°ì¸ valueê° ë°ê¹¥ ì½ëì ë°íë©ëë¤(yieldë 'ìì°íë¤, ì°ì¶íë¤âë¼ë ë»ì ê°ì§ â ì®ê¸´ì´).
next()ë íì ìë ë íë¡í¼í°ë¥¼ ê°ì§ ê°ì²´ë¥¼ ë°íí©ëë¤.
value: ì°ì¶ ê°done: í¨ì ì½ë ì¤íì´ ëë¬ì¼ë©´true, ìëë¼ë©´false
ì ëë ì´í°ë¥¼ ë§ë¤ê³ 첫 ë²ì§¸ ì°ì¶ ê°ì ë°ë ìì를 ì´í´ë´ ìë¤.
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}
íì¬ë¡ìë 첫 ë²ì§¸ ê°ë§ ë°ìì¼ë¯ë¡ í¨ì ì¤íì ë ë²ì§¸ ì¤ìì ë©ì·ìµëë¤.
generator.next()를 ë¤ì í¸ì¶í´ë´
ìë¤. ì¤íì´ ì¬ê°ëê³ ë¤ì yield를 ë°íí©ëë¤.
let two = generator.next();
alert(JSON.stringify(two)); // {value: 2, done: false}
generator.next()를 ë í¸ì¶íë©´ ì¤íì return문ì ë¤ë¤ë¥´ê³ í¨ìê° ì¢
ë£ë©ëë¤.
let three = generator.next();
alert(JSON.stringify(three)); // {value: 3, done: true}
ì´ì ì ëë ì´í°ê° ì¢
ë£ëììµëë¤. ë§ì§ë§ ê²°ê³¼ì¸ value:3ê³¼ done:true를 íµí´ ì´ë¥¼ íì¸í ì ììµëë¤.
ì ëë ì´í°ê° ì¢
ë£ëì기 ë문ì ì§ê¸ ìíìì generator.next()를 í¸ì¶í´ë ì무 ìì©ì´ ììµëë¤. generator.next()를 ì¬ë¬ë² í¸ì¶í´ë ê°ì²´ {done: true}ê° ë°íë ë¿ì
ëë¤.
function* f(â¦)ê° ë§ëì ìëë©´ function *f(â¦)ê° ë§ëì?ë ë¤ ë§ìµëë¤.
ê·¸ë°ë° *ë ì ëë ì´í° í¨ì를 ëíë´ë¯ë¡ ëê°ë 첫 ë²ì§¸ 문ë²ì´ ì í¸ë©ëë¤. *ë ì¢
ë¥ë¥¼ ëíë´ë ê²ì´ì§ ì´ë¦ì ëíë´ë ê²ì´ ìë기 ë문ì
ëë¤. ê·¸ë¬ë¯ë¡ *ë functionì ë¶ì´ëë¡ í©ìë¤.
ì ëë ì´í°ì ì´í°ë¬ë¸
next() ë©ìë를 ë³´ë©´ì ì§ìíì
¨ë¯ì´, ì ëë ì´í°ë ì´í°ë¬ë¸ ì
ëë¤.
ë°ë¼ì for..of ë°ë³µë¬¸ì ì¬ì©í´ ê°ì ì»ì ì ììµëë¤.
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
for(let value of generator) {
alert(value); // 1, 2ê° ì¶ë ¥ë¨
}
.next().valueì í¸ì¶íë ê² ë³´ë¤ ëì ë³´ì´ë¤ì.
ê·¸ë°ë° 주ìí ì ì´ ììµëë¤. ì ìì를 ì¤ííë©´ 1ê³¼ 2ë§ ì¶ë ¥ëê³ 3ì ì¶ë ¥ëì§ ììµëë¤.
ì´ì ë for..of ì´í°ë ì´ì
ì´ done: trueì¼ ë ë§ì§ë§ value를 무ìí기 ë문ì
ëë¤. ê·¸ë¬ë¯ë¡ for..of를 ì¬ì©íì ë 모ë ê°ì´ ì¶ë ¥ë길 ìíë¤ë©´ yieldë¡ ê°ì ë°íí´ì¼ í©ëë¤.
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let generator = generateSequence();
for(let value of generator) {
alert(value); // 1, 2, 3
}
ì ëë ì´í°ë ì´í°ë¬ë¸ ê°ì²´ì´ë¯ë¡ ì ëë ì´í°ìë ì ê° êµ¬ë¬¸(...) ê°ì ê´ë ¨ 기ë¥ì ì¬ì©í ì ììµëë¤.
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let sequence = [0, ...generateSequence()];
alert(sequence); // 0, 1, 2, 3
ì ìììì ...generateSequence()ë ë°ë³µ ê°ë¥í ì ëë ì´í° ê°ì²´ë¥¼ ë°°ì´ ììë¡ ë°ê¿ì¤ëë¤. (ì ê° êµ¬ë¬¸ì ëí ìì¸í ì¤ëª
ì ëë¨¸ì§ ë§¤ê°ë³ìì ì ê° êµ¬ë¬¸ìì ë³¼ ì ììµëë¤.)
ì´í°ë¬ë¸ ëì ì ëë ì´í° ì¬ì©í기
iterable ê°ì²´ë¥¼ ë¤ë£¬ ì±í°ìì from..to ì¬ì´ì ìë ê°ì ë°ííë ë°ë³µ ê°ë¥ ê°ì²´, range를 ë§ë¤ì´ ë³´ììµëë¤.
ì½ë를 ìê¸°í´ ë´ ìë¤.
let range = {
from: 1,
to: 5,
// for..of ìµì´ í¸ì¶ ì, Symbol.iteratorê° í¸ì¶ë©ëë¤.
[Symbol.iterator]() {
// Symbol.iteratorë ì´í°ë ì´í° ê°ì²´ë¥¼ ë°íí©ëë¤.
// for..ofë ë°íë ì´í°ë ì´í° ê°ì²´ë§ì ëìì¼ë¡ ëìíëë°, ì´ë ë¤ì ê°ë ì í´ì§ëë¤.
return {
current: this.from,
last: this.to,
// for..of ë°ë³µë¬¸ì ìí´ ê° ì´í°ë ì´ì
ë§ë¤ next()ê° í¸ì¶ë©ëë¤.
next() {
// next()ë ê°ì²´ ííì ê°, {done:.., value :...}ì ë°íí´ì¼ í©ëë¤.
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
}
};
// ê°ì²´ range를 ëìì¼ë¡ íë ì´í°ë ì´ì
ì range.fromê³¼ range.to ì¬ì´ì ì«ì를 ì¶ë ¥í©ëë¤.
alert([...range]); // 1,2,3,4,5
Symbol.iterator ëì ì ëë ì´í° í¨ì를 ì¬ì©íë©´, ì ëë ì´í° í¨ìë¡ ë°ë³µì´ ê°ë¥í©ëë¤.
ê°ì rangeì´ì§ë§, ì¢ ë ìì¶ë range를 ì´í´ë´
ìë¤.
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
range[Symbol.iterator]()ë ì ëë ì´í°ë¥¼ ë°ííê³ , ì ëë ì´í° ë©ìëë for..ofê° ëìíëë° íìí ì¬í(ìë ì¤ëª
)ì 충족ìí¤ë¯ë¡ ììê° ì ëìí©ëë¤.
.next()ë©ìëê° ìì- ë°í ê°ì ííë
{value: ..., done: true/false}ì´ì´ì¼ í¨
ì´ë ê² ì´í°ë¬ë¸ ê°ì²´ ëì ì ëë ì´í°ë¥¼ ì¬ì©í ì ìë ê²ì ì°ì°ì´ ìëëë¤. ì ëë ì´í°ë ì´í°ë ì´í°ë¥¼ ì´ë»ê² íë©´ ì½ê² 구íí ì§ë¥¼ ì¼ëì ëë©° ìë°ì¤í¬ë¦½í¸ì ì¶ê°ëììµëë¤.
ì ëë ì´í°ë¥¼ ì¬ì©í´ 구íí ììë ì´í°ë¬ë¸ì ì¬ì©í´ 구íí 기존 ììë³´ë¤ í¨ì¬ ê°ê²°í©ëë¤. ê·¸ë¦¬ê³ ëì¼í 기ë¥ì ì ê³µí©ëë¤.
ì ìììì ì íí ì°ì ê°ì ìì±íì§ë§, ê°ì ëììì´ ìì±íë ì ëë ì´í°ë¥¼ ë§ëë ê²ë ê°ë¥í©ëë¤. ëììë ìì¬ ëì를 ìì±íë ê²ì²ë¼ ë§ì´ì£ .
ëììë ê°ì ìì±íë ì ëë ì´í°ë¥¼ ë§ë¤ìë¤ë©´ ë¹ì°í for..of ìì breakë returnì´ ìì´ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´ 무í ë°ë³µë¬¸ì´ ëì´ì ì¤í¬ë¦½í¸ê° ë©ì¶¥ëë¤.
ì ëë ì´í° ì»´í¬ì§ì
ì ëë ì´í° ì»´í¬ì§ì (generator composition)ì ì ëë ì´í° ìì ì ëë ì´í°ë¥¼ 'ìë² ë©(embedding, composing)'í ì ìê² í´ì£¼ë ì ëë ì´í°ì í¹ë³ 기ë¥ì ëë¤.
먼ì , ì°ìë ì«ì를 ìì±íë ì ëë ì´í° í¨ì를 ë§ë¤ì´ë³´ê² ìµëë¤.
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
ê·¸ë¦¬ê³ ì´ í¨ì를 기ë°ì¼ë¡ ì¢ ë ë³µì¡í ê°ì ì°ìí´ì ìì±íë í¨ì를 ë§ë¤ì´ë´ ìë¤. ê° ìì± ê·ì¹ì ë¤ìê³¼ ê°ìµëë¤.
- ì²ìì ì«ì
0ë¶í°9ê¹ì§ë¥¼ ìì±í©ëë¤(문ì ì½ë 48ë¶í° 57ê¹ì§), - ì´ì´ì ìíë²³ ë문ì
Aë¶í°Zê¹ì§ë¥¼ ìì±í©ëë¤(문ì ì½ë 65ë¶í° 90ê¹ì§). - ì´ì´ì ìíë²³ ì문ì
aë¶í°zê¹ì§ë¥¼ ìì±í©ëë¤(문ì ì½ë 97ë¶í° 122ê¹ì§).
ì´ë° ê·ì¹ì 충족íë ì°ì ê°ì ë¹ë°ë²í¸ë¥¼ ë§ë¤ ë ìì©í ì ììµëë¤(ë¬¼ë¡ í¹ì 문ìë ì¶ê° í ì ììµëë¤).
ì¼ë° í¨ìë¡ë ì¬ë¬ ê°ì í¨ì를 ë§ë¤ê³ ê·¸ í¸ì¶ 결과를 ì´ëê°ì ì ì¥í í ë¤ì ê·¸ ê²°ê³¼ë¤ì ì¡°í©í´ì¼ ìíë 기ë¥ì 구íí ì ììµëë¤.
íì§ë§ ì ëë ì´í°ì í¹ì ë¬¸ë² yield*를 ì¬ì©íë©´ ì ëë ì´í°ë¥¼ ë¤ë¥¸ ì ëë ì´í°ì âë¼ì ë£ì ìâ ììµëë¤.
ì»´í¬ì§ì ì ì ì©í ì ëë ì´í°ë ë¤ìê³¼ ê°ìµëë¤.
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
function* generatePasswordCodes() {
// 0..9
yield* generateSequence(48, 57);
// 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); // 0..9A..Za..z
yield* ì§ììë ì¤íì ë¤ë¥¸ ì ëë ì´í°ì ììí©ëë¤(delegate). ì¬ê¸°ì 'ììâì yield* genì´ ì ëë ì´í° genì ëìì¼ë¡ ë°ë³µì ìííê³ , ì°ì¶ ê°ë¤ì ë°ê¹¥ì¼ë¡ ì ë¬íë¤ë ê²ì ì미í©ëë¤. ë§ì¹ ì¸ë¶ ì ëë ì´í°ì ìí´ ê°ì´ ì°ì¶ë ê²ì²ë¼ ë§ì´ì£ .
ì¤ì²© ì ëë ì´í°(generateSequence)ì ì½ë를 ì§ì ì¨ì¤ë ê²°ê³¼ë ê°ìµëë¤.
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
function* generateAlphaNum() {
// yield* generateSequence(48, 57);
for (let i = 48; i <= 57; i++) yield i;
// yield* generateSequence(65, 90);
for (let i = 65; i <= 90; i++) yield i;
// yield* generateSequence(97, 122);
for (let i = 97; i <= 122; i++) yield i;
}
let str = '';
for(let code of generateAlphaNum()) {
str += String.fromCharCode(code);
}
alert(str); // 0..9A..Za..z
ì ëë ì´í° ì»´í¬ì§ì ì ì¬ì©íë©´ í ì ëë ì´í°ì íë¦ì ìì°ì¤ë½ê² ë¤ë¥¸ ì ëë ì´í°ì ì½ì í ì ììµëë¤. ì ëë ì´í° ì»´í¬ì§ì ì ì¬ì©íë©´ ì¤ê° ê²°ê³¼ ì ì¥ ì©ëì ì¶ê° ë©ëª¨ë¦¬ê° íìíì§ ììµëë¤.
'yieldâ를 ì¬ì©í´ ì ëë ì´í° ì·ë°ì¼ë¡ ì ë³´ êµíí기
ì§ê¸ê¹ì§ ë°°ì´ ì ëë ì´í°ë ê°ì ìì±í´ì£¼ë í¹ì 문ë²ì ê°ì§ ì´í°ë¬ë¸ ê°ì²´ì ì ì¬íìµëë¤. ê·¸ë°ë° ì¬ì¤ ì ëë ì´í°ë ë ê°ë ¥íê³ ì ì°í 기ë¥ì ì ê³µí©ëë¤.
yieldê° ìë°©í¥ ê¸¸ê³¼ ê°ì ìí ì í기 ë문ì
ëë¤. yieldë 결과를 ë°ê¹¥ì¼ë¡ ì ë¬í ë¿ë§ ìëë¼ ê°ì ì ëë ì´í° ìì¼ë¡ ì ë¬í기ê¹ì§ í©ëë¤.
ê°ì ì, ë°ì¼ë¡ ì ë¬íë ¤ë©´ generator.next(arg)를 í¸ì¶í´ì¼ í©ëë¤. ì´ë ì¸ì argë yieldì ê²°ê³¼ê° ë©ëë¤.
ìì를 ì´í´ë´ ìë¤.
function* gen() {
// ì§ë¬¸ì ì ëë ì´í° ë° ì½ëì ëì§ê³ ëµì 기ë¤ë¦½ëë¤.
let result = yield "2 + 2 = ?"; // (*)
alert(result);
}
let generator = gen();
let question = generator.next().value; // <-- yieldë value를 ë°íí©ëë¤.
generator.next(4); // --> 결과를 ì ëë ì´í° ìì¼ë¡ ì ë¬í©ëë¤.
generator.next()를 ì²ì í¸ì¶í ë íì ì¸ìê° ìì´ì¼ í©ëë¤. ì¸ìê° ëì´ì¤ëë¼ë 무ìëì´ì¼ íì£ .generator.next()를 í¸ì¶íë©´ ì¤íì´ ììëê³ ì²« ë²ì§¸yield "2+2=?"ì ê²°ê³¼ê° ë°íë©ëë¤. ì´ ìì ìë ì ëë ì´í°ê°(*)ë¡ íìí ì¤ìì ì¤íì ì ì ë©ì¶¥ëë¤.- ê·¸ í, ì 그림ìì ë³´ë¯ì´
yieldì ê²°ê³¼ê° ì ëë ì´í°ë¥¼ í¸ì¶íë ì¸ë¶ ì½ëì ìë ë³ì,questionì í ë¹ë©ëë¤. - ë§ì§ë§ ì¤,
generator.next(4)ìì ì ëë ì´í°ê° ë¤ì ììëê³4ëresultì í ë¹ë©ëë¤(let result = 4).
ì¸ë¶ ì½ëìì next(4)를 ì¦ì í¸ì¶íì§ ìê³ ìë¤ë ì ì ì£¼ëª©í´ ì£¼ì기 ë°ëëë¤. ì ëë ì´í°ê° 기ë¤ë ¤ì£¼ê¸° ë문ì í¸ì¶ì ëì¤ì í´ë 문ì ê° ëì§ ììµëë¤.
ìì:
// ì¼ì ìê°ì´ ì§ë í ì ëë ì´í°ê° ë¤ì ììë¨
setTimeout(() => generator.next(4), 1000);
ì¼ë° í¨ìì ë¤ë¥´ê² ì ëë ì´í°ì ì¸ë¶ í¸ì¶ ì½ëë next/yield를 ì´ì©í´ 결과를 ì ë¬ ë° êµíí©ëë¤.
ë íëì ìì를 ì´í´ë³´ë©° ì´ ê³¼ì ì ìì¸í ììë³´ê² ìµëë¤.
function* gen() {
let ask1 = yield "2 + 2 = ?";
alert(ask1); // 4
let ask2 = yield "3 * 3 = ?"
alert(ask2); // 9
}
let generator = gen();
alert( generator.next().value ); // "2 + 2 = ?"
alert( generator.next(4).value ); // "3 * 3 = ?"
alert( generator.next(9).done ); // true
ì¤í íë¦ì ëíë¸ ê·¸ë¦¼ì ë¤ìê³¼ ê°ìµëë¤.
- ì ëë ì´í° ê°ì²´ê° ë§ë¤ì´ì§ê³ 첫 ë²ì§¸
.next()ê° í¸ì¶ëë©´, ì¤íì´ ììëê³ ì²« ë²ì§¸yieldì ë¤ë¤ë¦ ëë¤. - ì°ì¶ ê°ì ë°ê¹¥ ì½ëë¡ ë°íë©ëë¤.
- ë ë²ì§¸
.next(4)ë 첫 ë²ì§¸yieldì ê²°ê³¼ê° ë4를 ì ëë ì´í° ìì¼ë¡ ì ë¬í©ëë¤. ê·¸ë¦¬ê³ ë¤ì ì¤íì´ ì´ì´ì§ëë¤. - ì¤í íë¦ì´ ë ë²ì§¸
yieldì ë¤ë¤ë¥´ê³ , ì°ì¶ ê°("3 * 3 = ?")ì´ ì ëë ì´í° í¸ì¶ ê²°ê³¼ê° ë©ëë¤. - ì¸ ë²ì§¸
next(9)ë ë ë²ì§¸yieldì ê²°ê³¼ê° ë9를 ì ëë ì´í° ìì¼ë¡ ì ë¬í©ëë¤. ê·¸ë¦¬ê³ ë¤ì ì¤íì´ ì´ì´ì§ëë°,done: trueì´ë¯ë¡ ì ëë ì´í° í¨ìë ì¢ ë£ë©ëë¤.
ë§ì¹ âíí ê²ìâ ê°ì ë³´ì´ë¤ì. 첫 ë²ì§¸ next()를 ì ì¸í ê° next(value)ë íì¬ yieldì ê²°ê³¼ê° ë ê°ì ì ëë ì´í° ìì ì ë¬í©ëë¤. ê·¸ë¦¬ê³ ë¤ì yieldì ê²°ê³¼ë¡ ëëììµëë¤.
generator.throw
ì¬ë¬ ê°ì§ ìì를 íµí´ ì´í´ë³´ìë¯ì´ ì¸ë¶ ì½ëë yieldì ê²°ê³¼ê° ë ê°ì ì ëë ì´í° ìì ì ë¬í기ë í©ëë¤.
ê·¸ë°ë° ì¸ë¶ ì½ëê° ìë¬ë¥¼ ë§ë¤ê±°ë ëì§ ìë ììµëë¤. ìë¬ë ê²°ê³¼ì í ì¢ ë¥ì´ê¸° ë문ì ì´ë ìì°ì¤ë¬ì´ íìì ëë¤.
ìë¬ë¥¼ yield ìì¼ë¡ ì ë¬íë ¤ë©´ generator.throw(err)를 í¸ì¶í´ì¼ í©ëë¤. generator.throw(err)를 í¸ì¶íê² ëë©´ errë yieldê° ìë ì¤ë¡ ëì ¸ì§ëë¤.
"2 + 2 = ?"ì ì°ì¶ ê°ì´ ìë¬ë¥¼ ë°ììí¤ë ê²½ì°ë¥¼ ì´í´ë´
ìë¤.
function* gen() {
try {
let result = yield "2 + 2 = ?"; // (1)
alert("ììì ìë¬ê° ëì ¸ì¡ê¸° ë문ì ì¤í íë¦ì ì¬ê¸°ê¹ì§ ë¤ë¤ë¥´ì§ 못í©ëë¤.");
} catch(e) {
alert(e); // ìë¬ ì¶ë ¥
}
}
let generator = gen();
let question = generator.next().value;
generator.throw(new Error("ë°ì´í°ë² ì´ì¤ìì ëµì ì°¾ì§ ëª»íìµëë¤.")); // (2)
(2)ìì ì ëë ì´í° ìì¼ë¡ ëì§ ìë¬ë yieldì í¨ê» ë¼ì¸ (1)ìì ìì¸ë¥¼ ë§ëëë¤. ìì¸ë try..catchìì ì¡íê³ , ê´ë ¨ ì ë³´ê° ì¼ë¿ì°½ì ì¶ë ¥ë©ëë¤.
ì ëë ì´í° ììì ìì¸ë¥¼ ì²ë¦¬íì§ ììë¤ë©´ ìì¸ë ì¬í ìì¸ì ë§ì°¬ê°ì§ë¡ ì ëë ì´í° í¸ì¶ ì½ë(ì¸ë¶ ì½ë)ë¡ âë¨ì´ì ¸ ëìµëë¤â.
generator.throw(ë¼ì¸ (2))ìì ì ëë ì´í°ë¥¼ í¸ì¶íê³ ìì¼ë¯ë¡ ìëì ê°ì´ ìë¬ë¥¼ ì¬ê¸°ì ì¡ìë ë©ëë¤.
function* generate() {
let result = yield "2 + 2 = ?"; // Error in this line
}
let generator = generate();
let question = generator.next().value;
try {
generator.throw(new Error("ë°ì´í°ë² ì´ì¤ìì ëµì ì°¾ì§ ëª»íìµëë¤."));
} catch(e) {
alert(e); // ìë¬ ì¶ë ¥
}
ì´ë ê² ì ëë ì´í° ë°ê¹¥ìì ìë¬ë¥¼ ì¡ì§ 못íë©´ ìë¬ë ì ëë ì´í° í¸ì¶ ì½ë ë°ê¹¥ì¼ë¡ ë¨ì´ì ¸ ëê°ëë¤. ì¬ê¸°ìë ìë¬ë¥¼ ì¡ì§ 못íë©´ ì¤í¬ë¦½í¸ê° ì£½ê² ì£ .
ìì½
- ì ëë ì´í°ë ì ëë ì´í° í¨ì
function* f(â¦) {â¦}ì ì¬ì©í´ ë§ëëë¤. yieldì°ì°ìë ì ëë ì´í° ìì ìì´ì¼ í©ëë¤.next/yieldí¸ì¶ì ì¬ì©íë©´ ì¸ë¶ ì½ëì ì ëë ì´í° ê°ì 결과를 êµíí ì ììµëë¤.
모ë ìë°ì¤í¬ë¦½í¸ììë ì ëë ì´í°ë¥¼ ì ì¬ì©íì§ ììµëë¤. ê·¸ë¬ë ì ëë ì´í°ë¥¼ ì¬ì©íë©´ ì¤í ì¤ìë ì ëë ì´í° í¸ì¶ ì½ëì ë°ì´í°ë¥¼ êµíí ì ì기 ë문ì ì ì©í ê²½ì°ê° ì¢ ì¢ ììµëë¤. ê·¸ë¦¬ê³ ì ëë ì´í°ë¥¼ ì¬ì©íë©´ ì´í°ë¬ë¸ ê°ì²´ë¥¼ ì½ê² ë§ë¤ ì ìë¤ë ì¥ì ë ììµëë¤.
ë¤ì ì±í°ìì for await ... of 루í ì ë¹ë기 ë°ì´í° ì¤í¸ë¦¼ì ë¤ë£° ë ì¬ì©ëë ë¹ë기 ì ëë ì´í°(asnyc generator)ì ëí´ ììë³¼ ìì ì
ëë¤. ë¹ë기 ì ëë ì´í°ë íì´ì§ë¤ì´ì
ì ì¬ì©í´ ì ì¡ëë ë¹ë기 ë°ì´í° ì¤í¸ë¦¼ì ë¤ë£° ë ì¬ì©ë©ëë¤.
ì¹ íë¡ê·¸ëë°ìì ë°ì´í° ì¤í¸ë¦¼ì ë¤ë¤ì¼ íë ê²½ì°ê° ë§ìë°, ì ëë ì´í°ë ì´ ê²½ì°ì ì ì©í©ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.