Contrapressão e canalização
Gerencie o controle do fluxo com pipeTo e pipeThrough.
Contrapressão e canalização é uma aula grátis de JavaScript Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de JavaScript Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de JavaScript Academy inclui 4 aulas no total.
O problema da contrapressão
Se um produtor gera dados mais rapidamente do que um consumidor consegue processá-los, a memória fica cheia. A contrapressão é o mecanismo pelo qual um consumidor lento informa a um produtor rápido que ele deve diminuir a velocidade.
WritableStream
Um WritableStream é um destino no qual você grava blocos. Seu método de destino write(chunk) pode ser assíncrono, sinalizando que está pronto para o próximo bloco.
const sink = new WritableStream({
write(chunk) {
console.log("writing", chunk);
}
});Obtendo um gravador
getWriter() bloqueia o fluxo gravável e retorna um gravador com write(), close() e uma promessa ready.
const writer = sink.getWriter();
await writer.write("hello");
await writer.close();O sinal ready
Aguarde writer.ready antes de gravar. A promessa é resolvida quando o fluxo pode aceitar mais dados — isso é a contrapressão em ação.
await writer.ready;
await writer.write(chunk);pipeTo
readable.pipeTo(writable) conecta uma fonte a um destino e gerencia automaticamente a contrapressão para você. Ele retorna uma promessa que é resolvida quando o encadeamento é concluído.
await readableStream.pipeTo(writableStream);
console.log("done piping");pipeThrough
pipeThrough(transform) insere uma transformação entre a fonte e o destino, retornando o fluxo legível transformado. Encadeie várias transformações para criar um fluxo de processamento.
sourceStream
.pipeThrough(new TextDecoderStream())
.pipeThrough(parser)
.pipeTo(consumer);Limites de alta ocupação
O highWaterMark de uma estratégia de enfileiramento define quantos blocos podem ser enfileirados antes que a contrapressão seja ativada. Ajuste esse valor para equilibrar o desempenho e o uso de memória.
new ReadableStream(source, new CountQueuingStrategy({ highWaterMark: 4 }));desiredSize
O controlador desiredSize informa ao produtor quanto espaço ainda há na fila. Quando esse valor chega a zero ou fica abaixo de zero, pare de enfileirar dados.
pull(controller) {
while (controller.desiredSize > 0) {
controller.enqueue(nextChunk());
}
}Interrompendo um fluxo
Passe { signal } para pipeTo a fim de interromper todo o fluxo de processamento com um AbortController.
const ctrl = new AbortController();
readable.pipeTo(writable, { signal: ctrl.signal });
ctrl.abort();Opções de encadeamento
pipeTo aceita preventClose, preventAbort e preventCancel para controlar como os erros e a conclusão são propagados entre as extremidades.
readable.pipeTo(writable, { preventClose: true });Um fluxo completo
Juntando tudo: buscar bytes, decodificar, transformar e gravar em um destino — tudo com controle automático do fluxo.
const res = await fetch("/data");
await res.body
.pipeThrough(new TextDecoderStream())
.pipeThrough(lineSplitter)
.pipeTo(uiSink);Verificação rápida
Teste a contrapressão.
Recapitulação: contrapressão e encadeamento
Você conheceu WritableStream e os gravadores, aguardou ready para lidar com a contrapressão, conectou fluxos com pipeTo/pipeThrough, ajustou highWaterMark e acompanhou desiredSize, além de interromper fluxos de processamento. Isso conclui a API de fluxos.
Perguntas Frequentes
A aula “Contrapressão e canalização” é grátis?
Sim — o texto completo de “Contrapressão e canalização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de JavaScript Academy, atualize para CoddyKit PRO. O curso de JavaScript Academy inclui 4 aulas no total.
O que vou aprender em “Contrapressão e canalização”?
Gerencie o controle do fluxo com pipeTo e pipeThrough. Você pratica JavaScript Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar JavaScript Academy?
Nenhuma experiência prévia é necessária. JavaScript Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Contrapressão e canalização”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de JavaScript Academy?
Sim. Cada aula de JavaScript Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Streams legíveis
- Respostas de fetch em fluxo
- Streams de transformação
- Contrapressão e canalização