Lzh on GitHub

默认情况下,Valibot 同步验证每个模式。这通常是验证未知数据的最快方式,但有时你需要异步验证某些内容。例如,你可能想检查一个用户名是否已存在于你的数据库中。

工作原理

为了实现这一点,Valibot 在必要时提供了一个异步实现。唯一的区别是异步实现是基于 Promise 的。除此之外,API 和功能是完全相同的。

命名

异步实现的命名与同步实现相同,但在末尾添加了 Async 后缀。例如,pipe 的异步实现称为 pipeAsyncobject 的异步实现称为 objectAsync

嵌套

异步函数只能嵌套在其他异步函数内部。这意味着如果你需要异步验证对象内的字符串,你也必须将对象验证切换到异步实现。

反过来则没有这个必要。你可以在异步函数内部嵌套同步函数,我们建议在大多数情况下这样做,以将复杂性和打包大小保持在最低限度。

经验法则

我们建议你总是从同步实现开始,并仅在需要时将必要的代码部分移至异步实现。如果你使用 TypeScript,在这里不可能出错,因为我们的 API 是完全类型安全的,并且当你将异步函数嵌入到同步函数中时会发出通知。

示例

假设你想验证一个个人资料对象,并且需要异步检查数据库中的用户名。只有对象和用户名的验证需要是异步的,其余部分可以保持同步。

import * as v from 'valibot';
import { isUsernameAvailable } from '~/api';

const ProfileSchema = v.objectAsync({
  username: v.pipeAsync(v.string(), v.checkAsync(isUsernameAvailable)),
  avatar: v.pipe(v.string(), v.url()),
  description: v.pipe(v.string(), v.maxLength(1000)),
});