May 28, 2024


JavaScript developers are increasingly writing asynchronous code, which often requires waiting for certain conditions to be met. This is especially true in the world of asynchronous testing, where specific conditions may not have an explicit “await” method. In the past, developers have used functions like “waitForever” and “waitForTime” for JavaScript polling. However, there is now a more modern and efficient way to await a given state, known as the “waitFor” function.

The “waitFor” function is an asynchronous function that allows developers to specify a condition function, polling interval (in milliseconds), and an optional timeout (in milliseconds). Here is an example of how the “waitFor” function can be used:

// Polls every 50 milliseconds for a given condition
const waitFor = async (condition, pollInterval = 50, timeoutAfter) => {
// Track the start time for timeout purposes
const startTime =;

while (true) {
// Check for timeout, bail if too much time passed
if(typeof(timeoutAfter) === ‘number’ && > startTime + timeoutAfter) {
throw ‘Condition not met before timeout’;

// Check for condition 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));

// Using the “waitFor” function to await a condition
await waitFor(() => document.body.classList.has(‘loaded’));

Developers can also set timeouts using the “waitFor” function, as shown in the following example:

await waitFor(
() => document.body.classList.has(‘loaded’),
// Checks every 100 milliseconds
// Throws if the “loaded” class isn’t on the body after 1 second

The “waitFor” function is an essential tool, especially in testing environments where developers may not always have a handle on the Promise that can be awaited or then’d. This versatile function ensures that developers can await a condition in any environment, making it a valuable addition to any developer’s toolbox.


Leave a Reply

Your email address will not be published. Required fields are marked *