AsyncIterator
åºçº¿
广æ³å¯ç¨
*
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
AsyncIterator 对象æ¯ç¬¦å弿¥è¿ä»£å¨åè®®ç对象ï¼å
¶æä¾äº next() æ¹æ³ç¨ä»¥è¿åä¸ä¸ªå
ç°ä¸ºè¿ä»£å¨ç»æå¯¹è±¡ç promiseãAsyncIterator.prototype 对象æ¯ä¸ä¸ªéèçå
¨å±å¯¹è±¡ï¼ææå
ç½®ç弿¥è¿ä»£å¨é½ç»§æ¿èªå®ãå
¶æä¾äº [Symbol.asyncIterator]() æ¹æ³ï¼è¯¥æ¹æ³è¿å弿¥è¿ä»£å¨å¯¹è±¡æ¬èº«ï¼ä½¿å¼æ¥è¿ä»£å¨ä¹å¼æ¥å¯è¿ä»£ã
注æï¼AsyncIterator 䏿¯å
¨å±å¯¹è±¡ï¼å°½ç®¡å°æ¥ä¼åºç°å¼æ¥è¿ä»£å¨è¾
婿¹æ³ææ¡ãææå
ç½®å¼æ¥è¿ä»£å¨å
±äº«ç AsyncIterator.prototype 对象å¯ä»¥éè¿ä»¥ä¸ä»£ç è·å¾ï¼
const AsyncIteratorPrototype = Object.getPrototypeOf(
Object.getPrototypeOf(Object.getPrototypeOf((async function* () {})())),
);
æè¿°
ç®åï¼å¯ä¸å
ç½®ç JavaScript 弿¥è¿ä»£å¨æ¯ç±å¼æ¥çæå¨å½æ°è¿åç AsyncGenerator 对象ãè¿æä¸äºå
¶ä»çå
ç½®å¼æ¥è¿ä»£å¨åå¨äº web API ä¸ï¼ä¾å¦ ReadableStream ç弿¥è¿ä»£å¨ã
æ¯ä¸ªå¼æ¥è¿ä»£å¨é½æä¸ä¸ªä¸åçåå对象ï¼å®å®ä¹äºç¹å®å¼æ¥è¿ä»£å¨ä½¿ç¨ç next() æ¹æ³ãææè¿äºåå对象é½ç»§æ¿èª AsyncIterator.prototypeï¼å®æä¾äºä¸ä¸ª [Symbol.asyncIterator]() æ¹æ³ï¼è¯¥æ¹æ³è¿å弿¥è¿ä»£å¨å¯¹è±¡æ¬èº«ï¼ä½¿å¼æ¥è¿ä»£å¨ä¹å¯å¼æ¥è¿ä»£ã
夿³¨ï¼AsyncIterator.prototype å¹¶æªå®ç° [Symbol.iterator]()ï¼å æ¤é»è®¤æ
åµä¸ï¼å¼æ¥è¿ä»£å¨ä¸æ¯åæ¥å¯è¿ä»£å¯¹è±¡ã
å®ä¾æ¹æ³
AsyncIterator.prototype[Symbol.asyncIterator]()-
è¿å弿¥è¿ä»£å¨å¯¹è±¡æ¬èº«ãè¿ä½¿å¼æ¥è¿ä»£å¨å¯¹è±¡ä¹å¯ä»¥å¼æ¥è¿ä»£ã
示ä¾
>使ç¨å¼æ¥è¿ä»£å¨ä½ä¸ºå¼æ¥å¯è¿ä»£å¯¹è±¡
ææå
ç½®å¼æ¥è¿ä»£å¨é½å¯ä»¥å¼æ¥è¿ä»£ï¼å æ¤ä½ å¯ä»¥å¨ for await...of 循ç¯ä¸ä½¿ç¨å®ä»¬ï¼
const asyncIterator = (async function* () {
yield 1;
yield 2;
yield 3;
})();
(async () => {
for await (const value of asyncIterator) {
console.log(value);
}
})();
// è¾åºï¼1ï¼2ï¼3
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-asynciteratorprototype> |