yield
åºçº¿
广æ³å¯ç¨
èª 2016å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
yield å
³é®åç¨äºæå忢å¤çæå¨å½æ°ã
å°è¯ä¸ä¸
function* foo(index) {
while (index < 2) {
yield index;
index++;
}
}
const iterator = foo(0);
console.log(iterator.next().value);
// Expected output: 0
console.log(iterator.next().value);
// Expected output: 1
è¯æ³
[rv] = yield [expression];
expression-
å®ä¹éè¿è¿ä»£å¨åè®®ä»çæå¨å½æ°è¿åçå¼ã妿çç¥ï¼åè¿å
undefinedã rv-
è¿åä¼ éç»çæå¨ç
next()æ¹æ³çå¯éå¼ï¼ä»¥æ¢å¤å ¶æ§è¡ã
æè¿°
yield å
³é®å使çæå¨å½æ°æ§è¡æåï¼yield å
³é®ååé¢ç表达å¼çå¼è¿åç»çæå¨çè°ç¨è
ãå®å¯ä»¥è¢«è®¤ä¸ºæ¯ä¸ä¸ªåºäºçæå¨ççæ¬ç return å
³é®åã
yield å
³é®åå®é
è¿åä¸ä¸ª IteratorResult 对象ï¼å®æä¸¤ä¸ªå±æ§ï¼value å doneãvalue 屿§æ¯å¯¹ yield è¡¨è¾¾å¼æ±å¼çç»æï¼è done æ¯ falseï¼è¡¨ç¤ºçæå¨å½æ°å°æªå®å
¨å®æã
䏿¦éå° yield 表达å¼ï¼çæå¨ç代ç å°è¢«æåè¿è¡ï¼ç´å°çæå¨ç next() æ¹æ³è¢«è°ç¨ãæ¯æ¬¡è°ç¨çæå¨ç next() æ¹æ³æ¶ï¼çæå¨é½ä¼æ¢å¤æ§è¡ï¼ç´å°è¾¾å°ä»¥ä¸æä¸ªå¼ï¼
yieldï¼å¯¼è´çæå¨å次æåå¹¶è¿åçæå¨çæ°å¼ãä¸ä¸æ¬¡è°ç¨next()æ¶ï¼å¨yieldä¹åç´§æ¥ççè¯å¥ç»§ç»æ§è¡ãthrowç¨äºä»çæå¨ä¸æåºå¼å¸¸ãè¿è®©çæå¨å®å ¨åæ¢æ§è¡ï¼å¹¶å¨è°ç¨è ä¸ç»§ç»æ§è¡ï¼æ£å¦é常æ åµä¸æåºå¼å¸¸ä¸æ ·ã- å°è¾¾çæå¨å½æ°çç»å°¾ãå¨è¿ç§æ
åµä¸ï¼çæå¨çæ§è¡ç»æï¼å¹¶ä¸
IteratorResultç»è°ç¨è è¿åvalueç弿¯undefinedå¹¶ä¸done为trueã - å°è¾¾
returnè¯å¥ãå¨è¿ç§æ åµä¸ï¼çæå¨çæ§è¡ç»æï¼å¹¶å°IteratorResultè¿åç»è°ç¨è ï¼å ¶valueç弿¯ç±returnè¯å¥æå®çï¼å¹¶ä¸done为trueã
妿å°åæ°ä¼ éç»çæå¨ç next() æ¹æ³ï¼å该å¼å°æä¸ºçæå¨å½å yield æä½è¿åçå¼ã
å¨çæå¨ç代ç è·¯å¾ä¸ç yield è¿ç®ç¬¦ï¼ä»¥åéè¿å°å
¶ä¼ éç» Generator.prototype.next() æå®æ°çèµ·å§å¼çè½åä¹é´ï¼çæå¨æä¾äºå¼ºå¤§çæ§å¶åã
è¦åï¼ä¸å¹¸å°æ¯ï¼next() æ¯ä¸å¯¹ç§°çï¼ä½è¿å¹¶ä¸æ¯æ²¡æå¸®å©ï¼å®æ»æ¯åå½åæåç yield åéä¸ä¸ªå¼ï¼ä½æ¯è¿åçæ¯ yield ä¹å表达å¼çè¿ç®ç»æã
示ä¾
>ä½¿ç¨ yield
以ä¸ä»£ç æ¯ä¸ä¸ªçæå¨å½æ°ç声æã
function* countAppleSales() {
const saleList = [3, 7, 5];
for (let i = 0; i < saleList.length; i++) {
yield saleList[i];
}
}
䏿¦çæå¨å½æ°å·²å®ä¹ï¼å¯ä»¥éè¿æé ä¸ä¸ªè¿ä»£å¨æ¥ä½¿ç¨å®ã
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) çå¼åéç»çæå¨ãå¨ rv = yield expression è¿ä¸ªè¯æ³ä¸ï¼step ç¨äºæ¥æ¶è¿åå¼ââå°½ç®¡ç¬¬ä¸æ¬¡è°ç¨ next() æ¶å¿½ç¥ä¼ éç»çæå¨ next() æ¹æ³çå¼ã
function* counter(value) {
let step;
while (true) {
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
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # prod-YieldExpression> |