Race Conditions

A common pitfall with async validation is to ensure the value hasn't changed during async validation. Fortunately, every validation result from Strickland includes the value that was validated as a result prop, making these race conditions possible to detect and guard against.

Let's take a look at handling this race condition in application code:

const usernameValidator = [
    required(),
    length(2, 20),
    usernameIsAvailableTwoStage
];

let username = 'marty';
let usernameResult = validate(usernameValidator, username);

username = 'mcfly';

if (usernameResult.validateAsync) {
    usernameResult.validateAsync().then((asyncResult) => {
        if (asyncResult.value === username) {
            // this will not be reached since
            // the username has changed
            usernameResult = asyncResult;
        }
    });
}

Last updated