À medida que mais desenvolvedores de JavaScript escrevem se tornam assíncronos, é natural que seja necessário esperar que as condições sejam atendidas. Isso é especialmente verdadeiro em um mundo com testes assíncronos de condições que não fornecem uma função explícita de await
. Já escrevi sobre waitForever
, waitForTime
, e Polling em JavaScript no passado, mas eu queria ter uma forma mais moderna de await
de um determinado estado. Vamos dar uma olhada nesse super útil waitFor
super útil!
waitFor
é um async
que permite que os desenvolvedores forneçam uma função de condição, um intervalo de sondagem (em milissegundos) e um tempo limite opcional (em milissegundos).
// Polls every 50 milliseconds for a given condition const waitFor = async (condition, pollInterval = 50, timeoutAfter) => { // Track the start time for timeout purposes const startTime = Date.now(); while (true) { // Check for timeout, bail if too much time passed if(typeof(timeoutAfter) === 'number' && Date.now() > startTime + timeoutAfter) { throw 'Condition not met before timeout'; } // Check for conditon immediately const result = await condition(); // If the condition is met... if(result) { // Return the result.... return result; } // Otherwise wait and check after pollInterval await new Promise(r => setTimeout(r, pollInterval)); } };
Usar essa função é tão simples quanto fornecer uma função de condição:
await waitFor(() => document.body.classList.has('loaded'));
Também é simples cronometrar o intervalo e o tempo limite:
await waitFor( () => document.body.classList.has('loaded'), // Checks every 100 milliseconds 100, // Throws if the "loaded" class isn't on the body after 1 second 10000 );
Em um mundo ideal, os desenvolvedores sempre teriam um controle sobre o Promise
que poderiam ser await
‘d ou then
‘d. Na prática, porém, isso nem sempre acontece, especialmente em um ambiente de teste. Ser capaz de aguardar uma condição em qualquer ambiente é uma necessidade absoluta, portanto, mantenha esse snippet em sua caixa de ferramentas!