Skip to content

Async validation debounce

This recipe implements debounced validation for a field. Thanks to reatom’s concurrency mechanism, each new validation call automatically cancels the previous one. The field waits 300ms before making an API request to check if a username is already taken.

import { reatomField, sleep, abortVar, wrap } from '@reatom/core'
const usernameField = reatomField(
'',
{
validate: async ({ state }) => {
await wrap(sleep(300))
const response = await wrap(fetch(`/api/usernames?username=${state}`))
const { taken } = await wrap(response.json())
if (taken) return 'This username already taken'
},
},
'usernameField',
)