Como se comporta a call stack neste exemplo?
function task(message) {
// simular tarefa demorada
let n = 10000000000;
while (n > 0){
n--;
}
console.log(message);
}
console.log('Start script...');
task('Call an API');
console.log('Done!');
Exemplo adaptado de javascripttutorial.net
console.log("1");
console.log("2");
setTimeout(() => console.log("3"), 2000);
console.log("4");
setTimeout(fn, tempo) é usado para agendar execução futura.Fonte da imagem ao lado: JavaScript Tutorial
function getData(callback) {
fetch("https://api.restful-api.dev/objects/1")
.then(response => response.json())
.then(data => callback(data))
.catch(error => console.error("Error:", error));
}
function handle(data) {
console.log("Fetched Data:", data);
}
getData(handle);
Callback é uma função passada como parâmetro.
É executada quando uma operação termina.
function sayHello(name, callback) {
console.log("Hello, " + name);
callback();
}
function sayBye() {
console.log("Goodbye!");
}
sayHello("World", sayBye);
É possível "agendar" a execução da callback para um momento posterior.
function fazerCafe(tempo, callback) {
console.log("Fazendo o café")
setTimeout(() => {
callback("Café tá pronto!");
}, tempo);
console.log("Ainda fazendo o café...")
}
fazerCafe(2000, function (msg) {
console.log(msg);
});
JavaScript é single-threaded (uma tarefa por vez). Mas consegue lidar com tarefas assíncronas usando o Event Loop.

setTimeoutCrie um código que:
Callbacks aninhadas ficam difícil de ler. Isso é chamado de callback hell.
setTimeout(() => {
console.log("1");
setTimeout(() => {
console.log("2");
setTimeout(() => console.log("3"), 1000);
}, 1000);
}, 1000);
Solução: Promises + Async/Await.
pending (não resolvido), fulfilled (resolvido), rejected (rejeitado)..then() para tratar sucesso e .catch() para erro.const minhaPromise = new Promise((resolve, reject) => {
setTimeout(() => resolve("Concluído!"), 2000);
});
minhaPromise
.then((msg) => console.log(msg))
.catch((err) => console.log(err));
function buscarDados() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const sucesso = true; // simula sucesso ou erro
if (sucesso) {
resolve("Dados carregados com sucesso!");
} else {
reject("Erro ao buscar dados.");
}
}, 2000);
});
}
buscarDados()
.then(resultado => {
console.log(resultado);
})
.catch(erro => {
console.log(erro);
});
fetch (Requisições HTTP no JavaScript)fetch é uma função assíncrona usada para buscar dados de uma APIPromisefetch("https://api.restful-api.dev/objects/1")
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error("Erro:", error);
});
Adiciona async antes da função
Adiciona await antes de uma promise
Fácil de ler, sem usar .then().
async function exibirMensagem() {
const msg = await new Promise(resolve => {
setTimeout(() => resolve("Olá, Mundo!"), 2000);
});
console.log(msg);
}
exibirMensagem();
Usamos await para obter o resultado.
A resposta é um Response, que pode ser convertido em JSON.
async function carregarDados() {
try {
const response = await fetch("https://api.restful-api.dev/objects/1");
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Erro:", error);
}
}
carregarDados();
Use
fetch()+async/awaitpara APIs modernas.
.catch()Promises podem falhar .catch() para tratar.
await + try/catch é o jeito mais simples.
async function buscarErro() {
try {
const res = await fetch("https://api.com/erro");
const data = await res.json();
console.log(data);
} catch (error) {
console.log("Erro:", error.message);
}
}
buscarErro();
O navegador não fica bloqueado: ele faz as 3 chamadas em paralelo.
async function chamarTudo() {
const res1 = await fetch("https://api.restful-api.dev/objects/1");
const res2 = await fetch("https://api.restful-api.dev/objects/2");
const res3 = await fetch("https://api.restful-api.dev/objects/3");
console.log(await res1.json());
console.log(await res2.json());
console.log(await res3.json());
}
chamarTudo();
Desenvolva uma página em HTML e JavaScript que:
fetchasync/awaitVocê deve criar uma página com: título, botão chamado "Carregar Produtos" e uma área de resultados.
Ao clicar no botão, o programa deverá fazer uma requisição para a API, aguardar o retorno da API com async/await, converter a resposta para JSON, exibir os resultados em uma lista.
Conceitos-Chave:
fetch permite comunicação com APIs externas.Material adicional:
Dúvidas e Discussão
# Solução ```html <!DOCTYPE html> <html> <head> <title>Fetch API Example</title> </head> <body> <h1>Lista de Produtos</h1> <button id="loadBtn">Carregar Dados</button> <ul id="lista"></ul> <script> const botao = document.getElementById("loadBtn"); const lista = document.getElementById("lista"); botao.addEventListener("click", async function() { lista.innerHTML = "<li>Carregando...</li>"; try { const response = await fetch("https://api.restful-api.dev/objects"); const dados = await response.json(); lista.innerHTML = ""; // limpa lista dados.forEach(item => { const li = document.createElement("li"); let info = item.name; if (item.data) { info += " | " + JSON.stringify(item.data); } li.innerText = info; lista.appendChild(li); }); } catch (erro) { lista.innerHTML = "<li>Erro ao carregar dados</li>"; console.error(erro); } }); </script> </body> </html> ```