for await...of
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since ÑнваÑÑ 2020 г..
ÐÑÑажение for await...of ÑоздаÑÑ Ñикл, пÑоÑ
одÑÑий ÑеÑез аÑинÑ
ÑоннÑе иÑеÑиÑÑемÑе обÑекÑÑ, а Ñакже ÑинÑ
ÑоннÑе иÑеÑиÑÑемÑе ÑÑÑноÑÑи, вклÑÑаÑÑие: вÑÑÑоеннÑе String, Array, Array-подобнÑе обÑекÑÑ (напÑимеÑ., arguments или NodeList), TypedArray, Map, Set, а Ñакже опÑеделÑемÑе полÑзоваÑелем аÑинÑ
ÑоннÑе/ÑинÑ
ÑоннÑе ÑÑÑноÑÑи. Ðн вÑзÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий иÑеÑаÑионнÑй Ñ
Ñк Ñ Ð¸Ð½ÑÑÑÑкÑиÑми, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ оÑделÑного ÑвойÑÑва обÑекÑа.
СинÑакÑиÑ
for await (variable of iterable) {
statement
}
variable-
Ðа каждой иÑеÑаÑии знаÑение дÑÑгого ÑвойÑÑва пÑиÑваиваеÑÑÑ variable. variable Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑÑвлена Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевÑÑ Ñлов
const,let, orvar. iterable-
ÐбÑекÑ, ÑÑи иÑеÑиÑÑемÑе ÑвойÑÑва бÑдÑÑ Ð¿Ð¾Ð²ÑоÑÑÑÑÑÑ.
ÐÑеÑиÑование по аÑÐ¸Ð½Ñ ÑоннÑм пеÑеменнÑм
ÐÑ Ñакже можеÑе пеÑебÑаÑÑ Ð¾Ð±ÑекÑ, коÑоÑÑй Ñвно ÑеализÑÐµÑ Ð°ÑÐ¸Ð½Ñ ÑоннÑй иÑеÑиÑÑемÑй пÑоÑокол.
var asyncIterable = {
[Symbol.asyncIterator]() {
return {
i: 0,
next() {
if (this.i < 3) {
return Promise.resolve({ value: this.i++, done: false });
}
return Promise.resolve({ done: true });
},
};
},
};
(async function () {
for await (let num of asyncIterable) {
console.log(num);
}
})();
// 0
// 1
// 2
ÐÑеÑиÑование по аÑÐ¸Ð½Ñ ÑоннÑм генеÑаÑоÑам
ÐоÑколÑÐºÑ Ð°ÑинÑ
ÑоннÑе генеÑаÑоÑÑ ÑеализÑÑÑ Ð°ÑинÑ
ÑоннÑй пÑоÑокол Iterator, по ним можно пÑойÑи Ñиклом Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ for await... of
async function* asyncGenerator() {
var i = 0;
while (i < 3) {
yield i++;
}
}
(async function () {
for await (let num of asyncGenerator()) {
console.log(num);
}
})();
// 0
// 1
// 2
ÐÐ»Ñ Ð±Ð¾Ð»ÐµÐµ конкÑеÑного пÑимеÑа пеÑебоÑа аÑинÑ
Ñонного генеÑаÑоÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ for await... of, ÑаÑÑмоÑÑим пеÑÐµÐ±Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
из API. Ð ÑÑом пÑимеÑе ÑнаÑала ÑоздаÑÑÑÑ Ð°ÑинÑ
ÑоннÑй иÑеÑаÑÐ¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ñока даннÑÑ
, а заÑем он иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑазмеÑа оÑвеÑа Ð¾Ñ API.
async function* streamAsyncIterator(stream) {
const reader = stream.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
return;
}
yield value;
}
} finally {
reader.releaseLock();
}
}
// Fetches data from url and calculates response size using the async generator.
async function getResponseSize(url) {
const response = await fetch(url);
// Will hold the size of the response, in bytes.
let responseSize = 0;
// The for-await-of loop. Async iterates over each portion of the response.
for await (const chunk of streamAsyncIterator(response.body)) {
// Incrementing the total response length.
responseSize += chunk.length;
}
console.log(`Response Size: ${responseSize} bytes`);
// expected output: "Response Size: 1071472"
return responseSize;
}
getResponseSize("https://jsonplaceholder.typicode.com/photos");
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-for-in-and-for-of-statements> |