node:timers
O módulo node:timers no Azion Runtime: timeouts, intervalos, immediates, os timers baseados em Promise, exemplos e as APIs com suporte.
O módulo node:timers reúne as funções do Node.js que agendam a execução de código após um atraso ou em intervalos regulares. Use-o para gerenciar o trabalho assíncrono e para controlar quando cada parte de uma function é executada: adiar trabalho, adicionar um atraso curto ou coordenar tarefas assíncronas com setTimeout(). O Azion Runtime fornece o módulo por meio da compatibilidade com Node.js, e os timers baseados em Promise vêm de node:timers/promises.
Exemplos
Cada exemplo é uma function completa. Quando um exemplo mostra uma resposta, ela é a que uma function com deploy feito retorna.
setTimeout básico
Esta function registra duas linhas no log, aguarda 2.000 ms em um timer envolvido em uma Promise e depois responde:
A function responde após a espera:
Execução adiada com setTimeout
Esta function agenda dois atrasos sequenciais de 100 ms e retorna as etapas que registrou e o tempo total em milissegundos:
O helper setTimeoutAsync envolve timers.setTimeout() em uma Promise. No Azion Runtime, util.promisify() não transforma timers.setTimeout() em um timer baseado em Promise: a função promisificada passa o atraso na posição do callback, e a chamada lança EvalError: eval not allowed on setTimeout/setInterval parameter. Após o deploy, totalTimeMs não mede a espera, porque Date.now() não avança durante uma requisição.
Operações periódicas com setInterval
Esta function executa um callback em um intervalo de 50 ms durante 250 ms, limpa o intervalo e retorna cada tick com o seu tempo decorrido:
A function responde com quatro ticks:
Todos os valores de elapsed e o valor de durationMs são 0 porque, após o deploy, Date.now() não avança durante uma requisição. performance.now() avança. Para mais informações, consulte Globais.
Execução imediata com setImmediate
Esta function enfileira um callback de setImmediate(), um callback de setTimeout() com atraso de 0 ms e um callback de process.nextTick(), e depois registra a ordem em que eles são executados:
A function responde com a ordem dos callbacks: primeiro setImmediate(), depois setTimeout() com atraso de 0 ms e por último process.nextTick():
Timeout com cancelamento
Esta function cancela um timeout de 500 ms antes que ele dispare e depois chama uma API com um timeout que aborta a requisição por meio de um AbortController:
A function responde com o cancelamento e o resultado da API. O callback cancelado nunca adiciona Timeout executed:
Promises de timer
Esta function usa os timers baseados em Promise de node:timers/promises, descritos na documentação do timers/promises do Node.js:
A function responde com as etapas que registrou:
O iterador assíncrono que setInterval() retorna produz um valor e depois termina, por isso o loop registra apenas Interval tick 1. Os tempos decorridos são 0 porque, após o deploy, Date.now() não avança durante uma requisição.
Lógica de retry com backoff exponencial
Esta function repete uma operação que falha, com backoff exponencial a partir de um atraso inicial de 50 ms, coloca uma operação de 200 ms em disputa com um timeout de 50 ms e retorna os dois resultados como JSON:
O helper setTimeoutAsync envolve timers.setTimeout() em uma Promise, a forma que aguarda o atraso no Azion Runtime. Um helper criado com util.promisify(timers.setTimeout) lança EvalError: eval not allowed on setTimeout/setInterval parameter no primeiro atraso.
APIs com suporte
A tabela lista o status de cada API de node:timers e de node:timers/promises no Azion Runtime:
| API | Status |
|---|---|
setTimeout() | 🟢 Com suporte |
clearTimeout() | 🟢 Com suporte |
setInterval() | 🟢 Com suporte |
clearInterval() | 🟢 Com suporte |
setImmediate() | 🟢 Com suporte |
clearImmediate() | 🟢 Com suporte |
timers/promises.setTimeout() | 🟡 Parcialmente suportado |
timers/promises.setInterval() | 🟡 Parcialmente suportado |
timers/promises.setImmediate() | 🟢 Com suporte |
timers.active() | 🟡 Parcialmente suportado |
timers.enroll() | 🔴 Sem suporte |
timers.unenroll() | 🔴 Sem suporte |
timers.getActive() | 🟡 Parcialmente suportado |
As APIs marcadas como 🟡 Parcialmente suportado têm funcionalidade limitada em comparação com a implementação completa do Node.js. timers/promises.setTimeout() resolve com o valor passado a ela; com azion dev, ela é resolvida na hora, sem aguardar o atraso. O iterador assíncrono que timers/promises.setInterval() retorna produz um valor e depois termina. Para aguardar um atraso, envolva timers.setTimeout() em uma Promise: new Promise((resolve) => timers.setTimeout(resolve, ms)). O Node.js marca enroll() e unenroll() como obsoletas, e o Azion Runtime não oferece suporte a elas.
Um callback de timer precisa ser uma função. Após o deploy, uma string ou um número no lugar dele lança EvalError: eval not allowed on setTimeout/setInterval parameter. timers.setTimeout() retorna um objeto de timer com os métodos ref() e unref(), e o refresh() desse objeto não está definido. O módulo node:timers/promises exporta scheduler, setImmediate, setInterval e setTimeout, além de um export default.