Baseline Widely available
for await...of
è¯å¥å建ä¸ä¸ªå¾ªç¯ï¼è¯¥å¾ªç¯éå弿¥å¯è¿ä»£å¯¹è±¡ä»¥å忥å¯è¿ä»£å¯¹è±¡ã该è¯å¥åªè½å¨å¯ä»¥ä½¿ç¨ await
çä¸ä¸æä¸ä½¿ç¨ï¼å
æ¬å¼æ¥å½æ°ä½å
以忍¡åä¸ã
async function* foo() {
yield 1;
yield 2;
}
(async function () {
for await (const num of foo()) {
console.log(num);
// Expected output: 1
break; // Closes iterator, triggers return
}
})();
è¯æ³
for await (variable of iterable)
statement
variable
æ¯æ¬¡è¿ä»£æ¶ä»åºåæ¥æ¶ä¸ä¸ªå¼ãå¯ä»¥æ¯ç¨ const
ãlet
æ var
声æçåéï¼ä¹å¯ä»¥æ¯èµå¼ç®æ ï¼ä¾å¦ä¹å声æçåéãå¯¹è±¡å±æ§æè§£ææ¨¡å¼ï¼ãä½¿ç¨ var
声æçåéä¸ä¼å±éäºå¾ªç¯å
é¨ï¼å³å®ä»¬ä¸ for await...of
å¾ªç¯æå¨çä½ç¨åç¸åã
iterable
弿¥å¯è¿ä»£å¯¹è±¡æåæ¥å¯è¿ä»£å¯¹è±¡ãå¾ªç¯æä½çåºåå¼çæ¥æºã
statement
æ¯æ¬¡è¿ä»£åæ§è¡çè¯å¥ãå¯ä»¥å¼ç¨ variable
ãå¯ä»¥ä½¿ç¨åè¯å¥æ¥æ§è¡å¤ä¸ªè¯å¥ã
å½ for await...of
循ç¯è¿ä»£ä¸ä¸ªå¯è¿ä»£å¯¹è±¡æ¶ï¼å®é¦å
è·åå¯è¿ä»£å¯¹è±¡ç [Symbol.asyncIterator]()
æ¹æ³å¹¶è°ç¨å®ï¼è¯¥æ¹æ³è¿åä¸ä¸ªå¼æ¥è¿ä»£å¨ã妿 @asyncIterator
æ¹æ³ä¸åå¨ï¼å伿¥æ¾ [Symbol.iterator]()
æ¹æ³ï¼è¯¥æ¹æ³è¿åä¸ä¸ªåæ¥è¿ä»£å¨ãç¶åå°è¿åç忥è¿ä»£å¨å°è£
æä¸ä¸ªå¼æ¥è¿ä»£å¨ï¼éè¿å° next()
ãreturn()
å throw()
æ¹æ³è¿åçæ¯ä¸ªå¯¹è±¡é½å
è£
æä¸ä¸ªå·²å
ç°æå·²æç»ç promiseï¼å¦æ value
屿§ä¹æ¯ä¸ä¸ª promiseï¼åå°å
¶å
ç°ãç¶å循ç¯éå¤è°ç¨æç»å¼æ¥è¿ä»£å¨ç next()
æ¹æ³ï¼å¹¶çå¾
ï¼awaitï¼è¿åç promiseï¼ä»¥çæè¦åé
ç» variable
çå¼çåºåã
妿 for await...of
å¾ªç¯æåéåºï¼ä¾å¦éå° break
è¯å¥ææåºé误ï¼ï¼åä¼è°ç¨è¿ä»£å¨ç return()
æ¹æ³æ¥æ§è¡ä»»ä½æ¸
çä»»å¡ãå¨å¾ªç¯éåºä¹åï¼ä¼çå¾
è¿åç promiseã
for await...of
çåè½ä¸ for...of
循ç¯åºæ¬ä¸ç¸åï¼å¹¶ä¸å
±äº«è®¸å¤ç¸åçè¯æ³åè¯ä¹ãä½ä¹æä¸äºåºå«ï¼
for await...of
å¯ä»¥ç¨äºåæ¥å弿¥å¯è¿ä»£å¯¹è±¡ï¼è for...of
ä»
éç¨äºåæ¥å¯è¿ä»£å¯¹è±¡ãfor await...of
åªè½å¨å¯ä»¥ä½¿ç¨ await
çä¸ä¸æä¸ä½¿ç¨ï¼å
æ¬å¨å¼æ¥å½æ°ä½å
忍¡åä¸ä½¿ç¨ãå³ä½¿å¯è¿ä»£å¯¹è±¡æ¯åæ¥çï¼å¾ªç¯ä»ä¼çå¾
æ¯æ¬¡è¿ä»£çè¿åå¼ï¼å¯¼è´æ§è¡éåº¦è¾æ
¢ï¼å 为éè¦éå¤è§£å
promiseãiterable
æ¯ä¸ä¸ªäº§ç promise ç忥å¯è¿ä»£å¯¹è±¡ï¼for await...of
ä¼çæä¸ä¸ªå·²å
ç°çå¼åºåï¼è for...of
ä¼çæä¸ä¸ª promise åºåãï¼ç¶èï¼éè¦æ³¨æé误å¤ç忏
çââ请åé
è¿ä»£åæ¥å¯è¿ä»£å¯¹è±¡åçæå¨ï¼for await...of
ï¼variable
å¯ä»¥æ¯æ è¯ç¬¦ async
ï¼ä¾å¦ for await (async of foo)
ï¼ï¼for...of
ä¸å
许è¿ç§æ
åµãä½ è¿å¯ä»¥è¿ä»£ä¸ä¸ªæ¾å¼å®ç°å¼æ¥å¯è¿ä»£åè®®ç对象ï¼
const LIMIT = 3;
const asyncIterable = {
[Symbol.asyncIterator]() {
let i = 0;
return {
next() {
const done = i === LIMIT;
const value = done ? undefined : i++;
return Promise.resolve({ value, done });
},
return() {
// 妿æ¶è´¹è
å¨å¾ªç¯ä¸æåè°ç¨âbreakâæâreturnâï¼åä¼è¿è¡å°è¿éã
return { done: true };
},
};
},
};
(async () => {
for await (const num of asyncIterable) {
console.log(num);
}
})();
// 0
// 1
// 2
è¿ä»£å¼æ¥çæå¨
ç±äºå¼æ¥çæå¨å½æ°çè¿åå¼ç¬¦å弿¥å¯è¿ä»£åè®®ï¼å æ¤å¯ä»¥ä½¿ç¨ for await...of
æ¥è¿ä»£å®ä»¬ã
async function* asyncGenerator() {
let i = 0;
while (i < 3) {
yield i++;
}
}
(async () => {
for await (const num of asyncGenerator()) {
console.log(num);
}
})();
// 0
// 1
// 2
妿éè¦ä½¿ç¨ for await...of
è¿ä»£å¼æ¥çæå¨çæ´å
·ä½ç¤ºä¾æ¶ï¼å¯ä»¥èèè¿ä»£æ¥èª API çæ°æ®ã
该示ä¾é¦å å建ä¸ä¸ªç¨äºæ°æ®æµç弿¥å¯è¿ä»£å¯¹è±¡ï¼ç¶å使ç¨å®æ¥æ¥æ¾ API ååºç大å°ã
async function* streamAsyncIterable(stream) {
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) return;
yield value;
}
} finally {
reader.releaseLock();
}
}
// ä» URL è·åæ°æ®å¹¶ä½¿ç¨å¼æ¥çæå¨è®¡ç®ååºç大å°ã
async function getResponseSize(url) {
const response = await fetch(url);
// å°ä¿åååºç大å°ï¼ä»¥åè为åä½ã
let responseSize = 0;
// for-await-of 循ç¯ã弿¥è¿ä»£å¨éåååºçæ¯ä¸ªé¨åã
for await (const chunk of streamAsyncIterable(response.body)) {
// å¢å ååºæ»é¿åº¦ã
responseSize += chunk.length;
}
console.log(`ååºå¤§å°ï¼${responseSize} åè`); // "ååºå¤§å°ï¼1071472 åè"
return responseSize;
}
getResponseSize("https://jsonplaceholder.typicode.com/photos");
è¿ä»£åæ¥å¯è¿ä»£å¯¹è±¡åçæå¨
for await...of
循ç¯è¿å¯ä»¥å¤ç忥å¯è¿ä»£å¯¹è±¡åçæå¨ãå¨è¿ç§æ
åµä¸ï¼å®ä¼å¨å°å¼åé
ç»å¾ªç¯æ§å¶åéä¹åï¼å¨å
é¨å¯¹å
¶è¿è¡çå¾
ã
function* generator() {
yield 0;
yield 1;
yield Promise.resolve(2);
yield Promise.resolve(3);
yield 4;
}
(async () => {
for await (const num of generator()) {
console.log(num);
}
})();
// 0
// 1
// 2
// 3
// 4
// ä¸ for-of å¾ªç¯æ¯è¾ï¼
for (const numOrPromise of generator()) {
console.log(numOrPromise);
}
// 0
// 1
// Promise { 2 }
// Promise { 3 }
// 4
夿³¨ï¼ 请注æï¼å¦æåæ¥çæå¨çæäºä¸ä¸ªè¢«æç»ç promiseï¼é£ä¹å¨ä½¿ç¨ for await...of
è¿è¡å¤çæ¶ä¼æåºå¼å¸¸ï¼å¹¶ä¸ä¸ä¼è°ç¨çæå¨å
é¨ç finally
åãå¦æä½ éè¦ä½¿ç¨ try/finally
æ¥éæ¾ä¸äºå·²åé
çèµæºï¼è¿å¯è½æ¯ä¸å¯åçã
function* generatorWithRejectedPromises() {
try {
yield 0;
yield 1;
yield Promise.resolve(2);
yield Promise.reject(3);
yield 4;
throw 5;
} finally {
console.log("è°ç¨äº finally");
}
}
(async () => {
try {
for await (const num of generatorWithRejectedPromises()) {
console.log(num);
}
} catch (e) {
console.log("æè·äºå¼å¸¸", e);
}
})();
// 0
// 1
// 2
// æè·äºå¼å¸¸ 3
// ä¸ for-of å¾ªç¯æ¯è¾ï¼
try {
for (const numOrPromise of generatorWithRejectedPromises()) {
console.log(numOrPromise);
}
} catch (e) {
console.log("æè·äºå¼å¸¸", e);
}
// 0
// 1
// Promise { 2 }
// Promise { <rejected> 3 }
// 4
// æè·äºå¼å¸¸ 5
// è°ç¨äº finally
为äºç¡®ä¿åæ¥çæå¨ç finally
åå§ç»è¢«è°ç¨ï¼éè¦ä½¿ç¨å¯¹åºç循ç¯å½¢å¼ââ对äºå¼æ¥çæå¨ä½¿ç¨ for await...of
ï¼å¯¹äºåæ¥çæå¨åä½¿ç¨ for...of
ï¼å¹¶å¨å¾ªç¯å
æ¾å¼å°çå¾
çæç promiseã
(async () => {
try {
for (const numOrPromise of generatorWithRejectedPromises()) {
console.log(await numOrPromise);
}
} catch (e) {
console.log("æè·äºå¼å¸¸", e);
}
})();
// 0
// 1
// 2
// æè·äºå¼å¸¸ 3
// è°ç¨äº finally
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4