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
루íê° ì´í°ë¬ë¸ì ë°ë³µí ë, 먼ì ë¹ë기 ì´í°ë ì´í°ë¥¼ ë°ííë ì´í°ë¬ë¸ì [@@asyncIterator]()
ë©ìë를 ê°ì ¸ì í¸ì¶í©ëë¤. @asyncIterator
ë©ìëê° ìì¼ë©´ ë기 ì´í°ë ì´í°ë¥¼ ë°ííë [@@iterator]()
ë©ìë를 ì°¾ìµëë¤. ê·¸ë° ë¤ì ë°íë ë기 ì´í°ë ì´í°ë next()
, return()
, ê·¸ë¦¬ê³ throw()
ë©ìëìì ë°íë 모ë ê°ì²´ë¥¼ ì´íëê±°ë ê±°ë¶ë íë¡ë¯¸ì¤ë¡ ëííì¬ ë¹ë기 ì´í°ë ì´í°ë¡ ëíí©ëë¤. value
ìì±ë íë¡ë¯¸ì¤ì¸ ê²½ì° ì´íë©ëë¤. ê·¸ë° ë¤ì 루íë ìµì¢
ë¹ë기 ì´í°ë ì´í°ì next()
ë©ìë를 ë°ë³µì ì¼ë¡ í¸ì¶íê³ ë°íë íë¡ë¯¸ì¤ë¥¼ awaitíë©° ë³ìì í ë¹í ì¼ë ¨ì value
를 ìì±í©ëë¤.
for await...of
루íê° ì¼ì° ì¢
ë£ëë©´(ì: break
ë¬¸ì´ ë°ìíê±°ë ì¤ë¥ê° ë°ìí ê²½ì°) ì 리를 ìíí기 ìí´ ì´í°ë ì´í°ì return()
ë©ìëê° í¸ì¶ë©ëë¤. ë°íë íë¡ë¯¸ì¤ë 루íê° ì¢
ë£ë기 ì ì awaitë©ëë¤.
for await...of
ë ì¼ë°ì ì¼ë¡ for...of
루íì ëì¼íê² ê¸°ë¥íë©° ëì¼í 구문과 ì미를 ê³µì í©ëë¤. ìëì ëª ê°ì§ ì°¨ì´ì ì ììµëë¤.
for await...of
ë ë기ì ë¹ë기 ì´í°ë¬ë¸ 모ëìì ìëíì§ë§ for...of
ë ë기 ì´í°ë¬ë¸ììë§ ìëí©ëë¤.for await...of
ë ë¹ë기 í¨ì 본문 ë´ë¶ì 모ëì í¬í¨íì¬ await
를 ì¬ì©í ì ìë 컨í
ì¤í¸ììë§ ì¬ì©í ì ììµëë¤. ì´í°ë¬ë¸ì´ ëê¸°ì¸ ê²½ì°ìë 루íë ì¬ì í 매 ìíë§ë¤ ë°í ê°ì awaitíë¯ë¡ ë°ë³µëë íë¡ë¯¸ì¤ì ì¸ëíì¼ë¡ ì¸í´ ì¤í ìëê° ëë ¤ì§ëë¤.iterable
ì´ íë¡ë¯¸ì¤ë¥¼ì yieldíë ë기 ì´í°ë¬ë¸ì¸ ê²½ì° for await...of
ë ì¼ë ¨ì ì´íë ê°ì ìì±íë ë°ë©´ for...of
ë ì¼ë ¨ì íë¡ë¯¸ì¤ë¥¼ ìì±í©ëë¤. (ê·¸ë¬ë ì¤ë¥ ì²ë¦¬ì ì 리ì 주ìíì¸ì. ë기 ì´í°ë¬ë¸ê³¼ ì ëë ì´í°ì ìí 참조.)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(`Response Size: ${responseSize} bytes`); // "Response Size: 1071472"
return responseSize;
}
getResponseSize("https://jsonplaceholder.typicode.com/photos");
ë기 ì´í°ë¬ë¸ê³¼ ì ëë ì´í° ìí
for await...of
루íìì ë기 ì´í°ë¬ë¸ê³¼ ë기 ì ëë ì´í°ë ì¬ì©í ì ììµëë¤. ì´ ê²½ì°, ì°ì¶ë ê°ì 루í ì ì´ ë³ìì í ë¹í기 ì ì ë´ë¶ì ì¼ë¡ awaití©ëë¤.
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
ì°¸ê³ : ë기 ì ëë ì´í°ìì ê±°ë¶ë íë¡ë¯¸ì¤ yieldì ì ìíì¸ì. ì´ ê²½ì° for await...of
ë ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ì²ë¦¬í ë throw를 íê³ , í´ë¹ ì ëë ì´í°ì 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("called finally");
}
}
(async () => {
try {
for await (const num of generatorWithRejectedPromises()) {
console.log(num);
}
} catch (e) {
console.log("caught", e);
}
})();
// 0
// 1
// 2
// caught 3
// for-of 루íì ë¹êµ
try {
for (const numOrPromise of generatorWithRejectedPromises()) {
console.log(numOrPromise);
}
} catch (e) {
console.log("caught", e);
}
// 0
// 1
// Promise { 2 }
// Promise { <rejected> 3 }
// 4
// caught 5
// called finally
ë기 ì ì´ë ì´í°ì finally
ë¸ë¡ì íì í¸ì¶ëê² ë§ëë ¤ë©´, 루íì ì ì í íì(ë¹ë기 ì ëë ì´í°ì ê²½ì° for await...of
, ë기 ì ëë ì´í°ì ê²½ì° for...of
)ì ì¬ì©íê³ ë£¨í ë´ìì ëª
ìì ì¼ë¡ yieldë íë¡ë¯¸ì¤ë¥¼ awaití´ì¼ í©ëë¤.
(async () => {
try {
for (const numOrPromise of generatorWithRejectedPromises()) {
console.log(await numOrPromise);
}
} catch (e) {
console.log("caught", e);
}
})();
// 0
// 1
// 2
// caught 3
// called 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