Top-Level Await em Módulos ES: Simplificando Código Assíncrono no JavaScript
A necessidade de criar funções IIFE ((async () => { ... })()) para executar código assíncrono no escopo raiz do arquivo sempre gerou boilerplate desnecessário. Com o recurso Top-Level Await nativo do ECMAScript (ES2022), é possível utilizar a palavra-chave await diretamente no nível superior de módulos JavaScript (.mjs ou projetos com "type": "module").
JavaScript
// conexao.mjs (Módulo ES)
// Simulação de uma busca assíncrona de configurações de banco de dados
const carregarConfiguracao = () =>
new Promise((resolve) => {
setTimeout(() => {
resolve({ host: 'localhost', porta: 5432, db: 'producao' });
}, 1000);
});
console.log('Iniciando carregamento de configurações...');
// Uso direto do await no escopo raiz sem IFFE ou função envolvente
const config = await carregarConfiguracao();
console.log(`[Sucesso] Conectado ao banco '${config.db}' em ${config.host}:${config.porta}`);
// Exporta os dados já resolvidos para outros módulos da aplicação
export const dbConfig = config;
Pontos-chave
- Restrição de Módulo ES: O recurso funciona exclusivamente em ES Modules (arquivos
.mjs, tags<script type="module">no navegador ou projetos Node.js com"type": "module"nopackage.json). - Bloqueio Amigável de Importação: Módulos que importam um arquivo com Top-Level Await aguardam a resolução da Promise antes de executar o próprio código, garantindo dependências prontas.
- Eliminação de Boilerplate IIFE: Substitui o padrão antigo
(async () => { ... })()por uma sintaxe limpa, linear e mais fácil de ler no nível do módulo. - Tratamento de Erros: Exceções lançadas por um
awaitno nível superior devem ser capturadas com blocostry/catchpadrão para evitar rejeições não tratadas no processo.
