yield æ¼ç®å
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2016å¹´9æ.
yield æ¼ç®åã¯ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã䏿忢ãããåéãããããããã«ä½¿ç¨ãã¾ãã
試ãã¦ã¿ã¾ããã
function* foo(index) {
while (index < 2) {
yield index;
index++;
}
}
const iterator = foo(0);
console.log(iterator.next().value);
// äºæ³ãããçµæ: 0
console.log(iterator.next().value);
// äºæ³ãããçµæ: 1
æ§æ
yield
yield expression
弿°
expressionçç¥å¯-
ã¤ãã¬ã¼ã¿ã¼ãããã³ã«çµç±ã§ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãçæããå¤ãå®ç¾©ãã¾ããçç¥ããå ´åã代ããã«
undefinedãçæããã¾ãã
è¿å¤
ã¸ã§ãã¬ã¼ã¿ã¼ã® next() ã¡ã½ããã«æ¸¡ããããªãã·ã§ã³ã®å¤ãè¿ãããã®å®è¡ãåéãã¾ãã
ã¡ã¢:
ã¤ã¾ããnext() ã¯é対称ã§ãã常ã«å¤ãç¾å¨ä¸æããã¦ãã yield ã«éä¿¡ãã¾ãããæ¬¡ã® yield ã®ãªãã©ã³ããè¿ãã¾ããæåã® next() å¼ã³åºãã«æ¸¡ããã弿°ã¯ãç¾å¨ä¸æããã¦ãã yield ãåå¨ããªãããåå¾ã§ãã¾ããã
解説
yield ãã¼ã¯ã¼ãã¯ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®å®è¡ã䏿忢ããã¸ã§ãã¬ã¼ã¿ã¼ã®å¼ã³åºãå
ã« yield ãã¼ã¯ã¼ãã«ç¶ãå¤ãè¿ãã¾ããããã¯ã return ãã¼ã¯ã¼ãã®ã¸ã§ãã¬ã¼ã¿ã¼çã¨èãããã¨ãã§ãã¾ãã
yield ã¯ãããå«ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®ä¸ã§ç´æ¥å¼ã³åºããã¨ããã§ãã¾ãããå¼ã³åºãå
ã®é¢æ°ããå¼ã³åºããã¨ã¯ã§ãã¾ããã
ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãå¼ã³åºãã¨ãGenerator ãªãã¸ã§ã¯ããæ§ç¯ããã¾ãããã®ã¸ã§ãã¬ã¼ã¿ã¼ã® next() ã¡ã½ãããå¼ã³åºããããã³ã«ãã¸ã§ãã¬ã¼ã¿ã¼ã¯å®è¡ãåéããæ¬¡ã®ããããã«éããã¾ã§å®è¡ãç¶ãã¾ãã
yieldå¼ããã®å ´åãã¸ã§ãã¬ã¼ã¿ã¼ã¯ä¸æåæ¢ããnext()ã¡ã½ããã¯ãã¤ãã¬ã¼ã¿ã¼çµæãªãã¸ã§ã¯ããè¿ãã¾ãããã®ãªãã¸ã§ã¯ãã«ã¯ãvalueã¨doneã® 2 ã¤ã®ããããã£ãããã¾ããvalueããããã£ã¯yieldæ¼ç®åã®å¾ã«ããå¼ã®å¤ã§ãããdoneã¯falseã§ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãå®å ¨ã«çµäºãã¦ããªããã¨ã示ãã¾ãã- ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®çµäºããã®å ´åãã¸ã§ãã¬ã¼ã¿ã¼ã®å¦çãçµäºãã
next()ã¡ã½ããã¯ã¤ãã¬ã¼ã¿ã¼çµæãªãã¸ã§ã¯ããè¿ãã¾ãããã®ãªãã¸ã§ã¯ãã§ã¯valueãundefinedãdoneãtrueã¨ãªãã¾ãã returnæããã®å ´åãã¸ã§ãã¬ã¼ã¿ã¼ã®å¦çã¯çµäºããnext()ã¡ã½ããã¯ã¤ãã¬ã¼ã¿ã¼çµæãªãã¸ã§ã¯ããè¿ãã¾ãããã®ãªãã¸ã§ã¯ãã§ã¯ãvalueãæå®ãããè¿å¤ã¨ãªããdoneã¯trueã¨ãªãã¾ããthrowæãããã¯ãã¸ã§ãã¬ã¼ã¿ã¼ã®å®è¡ãå®å ¨ã«åæ¢ããnext()ã¡ã½ããã¯æå®ãããä¾å¤ãçºçãã¾ãã
yield å¼ã§ä¸æåæ¢ããã¨ãã¸ã§ãã¬ã¼ã¿ã¼ã®ã³ã¼ãå®è¡ã¯ãã¸ã§ãã¬ã¼ã¿ã¼ã® next() ã¡ã½ãããå度å¼ã³åºãããã¾ã§åæ¢ããã¾ã¾ã«ãªãã¾ããã¸ã§ãã¬ã¼ã¿ã¼ã® next() ã¡ã½ããã«ãªãã·ã§ã³ã®å¤ã渡ãããå ´åããã®å¤ã¯ã¸ã§ãã¬ã¼ã¿ã¼ã®ç¾å¨ã® yield æä½ã«ãã£ã¦è¿ãããå¤ã¨ãªãã¾ããæåã® next() å¼ã³åºãã«ã¯ã対å¿ãã䏿ããã yield æä½ãæããªããããæåã® next() å¼ã³åºãã§æ¸¡ããã弿°ãåå¾ããæ¹æ³ã¯ããã¾ããã
ã¸ã§ãã¬ã¼ã¿ã¼ã® return() ã¾ã㯠throw() ã¡ã½ãããå¼ã³åºãããå ´åã return æã¾ã㯠throw æã䏿忢ãã yield å¼ã§å®è¡ããããã®ããã«åä½ãã¾ããã¸ã§ãã¬ã¼ã¿ã¼é¢æ°æ¬ä½å
ã§ try...catch...finally ã使ç¨ãããã¨ãã§ãã¾ãã return() ã¾ã㯠throw() ã¡ã½ãããå¼ã³åºãããå ´åãä¿çä¸ã® yield å¼ãåå¨ããªãå ´åï¼next() ãã¾ã å¼ã³åºããã¦ããªãããã¸ã§ãã¬ã¼ã¿ã¼ãæ¢ã«å®äºãã¦ããããï¼ãæ©æå®äºã¯å¦çã§ãããã¸ã§ãã¬ã¼ã¿ã¼ã¯å¸¸ã«çµäºãã¾ãã
ä¾
>yield ã®ä½¿ç¨
次ã®ã³ã¼ãã¯ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ã®å®ç¾©ä¾ã§ãã
function* countAppleSales() {
const saleList = [3, 7, 5];
for (const sale of saleList) {
yield sale;
}
}
ã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãå®ç¾©ãããã¨ãã覧ã®ããã«ã¤ãã¬ã¼ã¿ã¼ãæ§ç¯ããããã«ä½¿ç¨ããã¾ãã
const appleStore = countAppleSales(); // Generator { }
console.log(appleStore.next()); // { value: 3, done: false }
console.log(appleStore.next()); // { value: 7, done: false }
console.log(appleStore.next()); // { value: 5, done: false }
console.log(appleStore.next()); // { value: undefined, done: true }
ã¸ã§ãã¬ã¼ã¿ã¼ã«ã¯ next(value) ã§å¤ã渡ããã¨ãã§ãã¾ããstep 㯠yield å¼ã®è¿å¤ã¨ãã¦è©ä¾¡ãã¾ãããã ããnext() ãæåã®æç¹ã§å¼ã³åºãããéã«ã¸ã§ãã¬ã¼ã¿ã¼ã® next() ã¡ã½ããã«æ¸¡ãããå¤ã¯ç¡è¦ããã¾ãã
function* counter(value) {
while (true) {
const step = yield value++;
if (step) {
value += step;
}
}
}
const generatorFunc = counter(0);
console.log(generatorFunc.next().value); // 0
console.log(generatorFunc.next().value); // 1
console.log(generatorFunc.next().value); // 2
console.log(generatorFunc.next().value); // 3
console.log(generatorFunc.next(10).value); // 14
console.log(generatorFunc.next().value); // 15
console.log(generatorFunc.next(10).value); // 26
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # prod-YieldExpression> |