Assíncrono · unidade 19 de 27
Promises
Um resultado futuro precisa de um contrato previsível.
01 / 07Use as setas do teclado ou deslize
Leitura
Estados, executor, encadeamento, propagação de erros e a ponte entre callbacks e Promises.
No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.
A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.
Código
return fetchUser(id)
.then(user => fetchOrders(user.id))
.then(orders => summarize(orders))
.catch(handleError)O que fica
- Uma Promise sai de pending apenas uma vez.
- Cada then cria uma nova Promise e deve retornar operações internas.
- Rejeições e throws percorrem a cadeia até o próximo catch.
Prática guiada.Leia, rode, quebre e explique cada exercício.
Prática guiada / unidade 19
Um problema de cada vez.
Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.
delayPromise(ms, value)
01 / Entenda
Enunciado
retorna uma nova Promise que resolve
com value depois de ms milissegundos (setTimeout dentro do
executor da Promise).
02 / Implemente
Sua tentativa
Comece pela assinatura e resolva sem olhar a resposta.
function delayPromise(ms, value) {
// Escreva sua solução aqui.
}03 / Preveja
Entrada e saída
Use estes exemplos para entender o contrato antes de programar.
Entrada / chamada
delayPromise(10, "ok")Retorno esperado
resolve com o valor após o atraso04 / Teste
Prove que funciona
O teste chama sua função e compara o resultado real com o esperado.
Como utilizar este teste
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="delayPromise" exercises.test.jsComportamentos cobertos
- resolve com o valor após o atraso
Ver código completo do teste
test("delayPromise: resolve com o valor após o atraso", async () => {
const result = await delayPromise(10, "ok");
assert.equal(result, "ok");
});Ainda travou?
Dicas graduais
Nível 1 — direção, sem código
Para delayPromise: o executor de new Promise((resolve, reject) => ...)
roda imediatamente e de forma síncrona. O que dentro dele precisa ser
assíncrono para o resolve só acontecer depois de ms?
Nível 2 — pista mais direta
delayPromise: return new Promise((resolve) => setTimeout(() => resolve(value), ms));
05 / Compare
Resolução
function delayPromise(ms, value) {
return Promise.reject(new Error("not implemented: delayPromise"));
}