Introdução às Filas de Tarefas em TypeScript
\n\nUma fila de tarefas (task queue) é uma das estruturas de dados fundamentais na programação, que opera pelo princípio "primeiro a entrar, primeiro a sair" (FIFO). Em TypeScript, as filas de tarefas são amplamente utilizadas para gerenciar operações assíncronas, processar requisições, organizar processos em segundo plano e muitos outros cenários.
\n\nNeste artigo, vamos explorar como criar e usar filas de tarefas em TypeScript do zero. Você aprenderá a implementar uma fila básica, adicionar prioridades e tratar erros. O material é voltado para desenvolvedores iniciantes familiarizados com os fundamentos do TypeScript.
\n\nO que é uma fila de tarefas e por que ela é necessária?
\n\nUma fila é uma lista ordenada de elementos, onde novos elementos são adicionados ao final e a remoção ocorre do início. Imagine uma fila em uma loja: o primeiro cliente é atendido primeiro, e os novos entram no final.
\n\nNa programação, as filas de tarefas são usadas para:
\n\n- \n
- Processamento assíncrono — executar tarefas em segundo plano sem bloquear o fluxo principal \n
- Gerenciamento de carga — limitar o número de operações executadas simultaneamente \n
- Processamento de eventos — processar requisições recebidas sequencialmente \n
- Agendamento de tarefas — executar tarefas com atraso ou em horários programados \n
Implementação de uma fila de tarefas básica em TypeScript
\n\nCriando a classe da fila
\n\nVamos começar com uma implementação simples de fila em TypeScript. Criaremos a classe TaskQueue, que suporta operações básicas:
// task-queue.ts\ntype Task<T> = () => Promise<T>;\n\nclass TaskQueue<T> {\n private queue: Task<T>[] = [];\n private isProcessing = false;\n\n // Adicionar tarefa à fila\n enqueue(task: Task<T>): void {\n this.queue.push(task);\n if (!this.isProcessing) {\n this.processQueue();\n }\n }\n\n // Processar a fila\n private async processQueue(): Promise<void> {\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const task = this.queue.shift()!;\n try {\n const result = await task();\n console.log('Tarefa concluída:', result);\n } catch (error) {\n console.error('Erro ao executar a tarefa:', error);\n }\n }\n\n this.isProcessing = false;\n }\n\n // Verificar se a fila está vazia\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n // Obter o tamanho da fila\n size(): number {\n return this.queue.length;\n }\n}\n\nUsando a fila
\n\nAgora vamos ver como usar nossa classe na prática:
\n\n// example.ts\nconst taskQueue = new TaskQueue<string>();\n\n// Criar várias tarefas assíncronas\nconst task1 = async () => {\n await delay(1000);\n return 'Primeira tarefa concluída';\n};\n\nconst task2 = async () => {\n await delay(500);\n return 'Segunda tarefa concluída';\n};\n\nconst task3 = async () => {\n await delay(200);\n return 'Terceira tarefa concluída';\n};\n\n// Adicionar tarefas à fila\ntaskQueue.enqueue(task1);\ntaskQueue.enqueue(task2);\ntaskQueue.enqueue(task3);\n\n// Função auxiliar\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Resultado:\n// Tarefa concluída: Primeira tarefa concluída (após 1s)\n// Tarefa concluída: Segunda tarefa concluída (após 1.5s)\n// Tarefa concluída: Terceira tarefa concluída (após 1.7s)\n\nFila avançada com prioridades
\n\nEm projetos reais, muitas vezes é necessário processar tarefas com diferentes prioridades. Vamos expandir nossa fila adicionando suporte a prioridades:
\n\n// priorit