Baseline Widely available
A declaração for await...of
cria um loop que itera sobre objetos iteráveis assÃncronos, bem como sobre iteráveis sÃncronos, incluindo: String
, Array
, Array
-como objetos (e.g., arguments
or NodeList
), TypedArray
, Map
, Set
, e iteráveis async/sync. Invoca um hook de iteração personalizado com instruções a serem executadas para o valor de cada propriedade do objeto.
for await (variável of iterável) { // declaração }
variável
Em cada iteração, o valor de uma propriedade diferente é atribuÃdo à variável. A variável pode ser declarada como const
, let
ou var
.
iterável
Objeto cujas propriedades iteráveis devem ser iteradas.
Você também pode iterar sobre um objeto que explicidamente implementa protocolo iterável assÃncrono(async iterable protocol):
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
Iterando sobre generators assÃncronos
Como os geradores assÃncronos implementam o protocolo assÃncrono Iterator, eles podem fazer um loop usando 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
Para termos um exemplo mais concreto de iteração sobre um generator assÃncrono usando for await... of
, considere iterar sobre dados obtidos através de um fecth de uma API. Este exemplo cria primeiro um iterador assÃncrono para um stream de dados e depois usa-o para encontrar o tamanho da resposta da 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();
}
}
// Obtém dados do URL e calcula o tamanho da resposta usando o generator assÃncrono
async function getResponseSize(url) {
const response = await fetch(url);
// Guardará o tamanho do response em bytes.
let responseSize = 0;
// O for-wait-loop irá iterar de forma assÃncrona sobre cada parte do response.
for await (const chunk of streamAsyncIterator(response.body)) {
// Incrementa o valor do responseSize
responseSize += chunk.length;
}
console.log(`Response Size: ${responseSize} bytes`);
// output esperado:"Response Size: 1071472"
return responseSize;
}
getResponseSize("https://jsonplaceholder.typicode.com/photos");
Especificações Compatibilidade com navegadores Veja também
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