AsyncGenerator
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
AsyncGenerator 对象ç±å¼æ¥çæå¨å½æ°è¿åï¼å¹¶ä¸å®ç¬¦å弿¥å¯è¿ä»£åè®®å弿¥è¿ä»£å¨åè®®ã
弿¥çæå¨æ¹æ³æ»æ¯äº§ç Promise 对象ã
AsyncGenerator æ¯éèç±» AsyncIterator çåç±»ã
å°è¯ä¸ä¸
async function* foo() {
yield await Promise.resolve("a");
yield await Promise.resolve("b");
yield await Promise.resolve("c");
}
let str = "";
async function generate() {
for await (const val of foo()) {
str = str + val;
}
console.log(str);
}
generate();
// Expected output: "abc"
æé 彿°
AsyncGenerator æé 彿°å¹¶éå
¨å±å¯ç¨çãAsyncGenerator çå®ä¾å¿
é¡»ä»å¼æ¥çæå¨å½æ°è¿åã
async function* createAsyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3
å®é
ä¸ï¼å¹¶æ²¡æå¯¹åº AsyncGenerator æé 彿°ç JavaScript å®ä½ãåªæä¸ä¸ªéè对象ï¼å
¶æ¯ææç±å¼æ¥çæå¨å½æ°å建ç对象æå
±äº«çåå对象ãè¿ä¸ªå¯¹è±¡éå¸¸è¢«é£æ ¼å为 AsyncGenerator.prototype æ¥ä½¿å
¶çèµ·æ¥åæ¯ä¸ä¸ªç±»ï¼ä½å®æ´æ°å½çç§°å¼åºè¯¥æ¯ AsyncGenerator.prototype.prototypeï¼å 为 AsyncGeneratorFunction æ¯ä¸ä¸ªå®é
ç JavaScript å®ä½ã
å®ä¾å±æ§
è¿äºå±æ§å®ä¹å¨ AsyncGenerator.prototype å¹¶ç±ææ AsyncGenerator å®ä¾å
±äº«ã
AsyncGenerator.prototype.constructor-
ç¨äºå建å®ä¾å¯¹è±¡çæé 彿°ã对äº
AsyncGeneratorå®ä¾ï¼åå§å¼æ¯AsyncGeneratorFunction.prototypeã夿³¨ï¼
AsyncGenerator对象并ä¸ä¼åå¨å建å®ä»¬ç弿¥çæå¨å½æ°çå¼ç¨ã AsyncGenerator.prototype[Symbol.toStringTag]-
[Symbol.toStringTag]屿§çåå§å¼æ¯å符串"AsyncGenerator"ãè¯¥å±æ§å¨Object.prototype.toString()ä¸ä½¿ç¨ã
å®ä¾æ¹æ³
ä¹ä»å
¶ç¶ç±» AsyncIterator ç»§æ¿å®ä¾æ¹æ³ã
AsyncGenerator.prototype.next()-
è¿å
Promiseï¼å®å°éè¿yield表达å¼äº§ççç»å®å¼å ç°ã AsyncGenerator.prototype.return()-
就好åå¨çæå¨çæåä½ç½®æå ¥ä¸ä¸ª
returnè¯å¥ï¼è¿å°ç»æçæå¨å¹¶å 许çæå¨æ§è¡ä»»ä½æ¸ çä»»å¡ï¼å°¤å ¶æ¯ä¸try...finallyåç»åçæ¶åã AsyncGenerator.prototype.throw()-
就好åå¨çæå¨çæåä½ç½®æå ¥ä¸ä¸ª
throwè¯å¥ï¼è¿å°éç¥çæå¨é误çç¶åµå¹¶å 许å»å¤çéè¯¯ï¼æè æ§è¡æ¸ çæä½å¹¶å ³éå®èªå·±ã
示ä¾
>è¿ä»£å¼æ¥çæå¨
以ä¸ç¤ºä¾å°éåè¿ä»£å¼æ¥çæå¨ï¼ä»¥éåçæ¶é´é´éå°å¼ 1-6 æå°å°æ§å¶å°ã注æï¼æ¯æ¬¡äº§ç Promise çæ¶åï¼å®ä¼å¨ for await...of 循ç¯ä¸èªå¨å°å
ç°ã
// 弿¥ä»»å¡ãå设å®å¨å®è·µä¸åäºä¸äºæ´æç¨çäºæ
ã
function delayedValue(time, value) {
return new Promise((resolve /*, reject*/) => {
setTimeout(() => resolve(value), time);
});
}
async function* generate() {
yield delayedValue(2000, 1);
yield delayedValue(100, 2);
yield delayedValue(500, 3);
yield delayedValue(250, 4);
yield delayedValue(125, 5);
yield delayedValue(50, 6);
console.log("å
¨é¨å®æï¼");
}
async function main() {
for await (const value of generate()) {
console.log("å¼", value);
}
}
main().catch((e) => console.error(e));
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-asyncgenerator-objects> |