# 异步验证

URL: https://caijiao.org/yup/async
Source: docs/yup/async.md
Description: 说明 Yup 如何支持异步验证，例如验证用户名是否已存在。

Yup 支持异步验证，可以在校验过程中调用异步函数，例如检查用户名是否已存在。

## 导入方式

```js
import { string } from 'yup';
````

## 异步验证示例

```js
const schema = string().required().test(
  'check-username',
  '用户名已存在',
  async (value) => {
    const exists = await fakeApiCheckUsername(value);
    return !exists;
  }
);

// 模拟异步 API
async function fakeApiCheckUsername(username) {
  const existingUsers = ['Alice', 'Bob'];
  return existingUsers.includes(username);
}
```

* `test(name, message, fn)`：自定义验证函数
* 函数可以返回 Promise
* Yup 会等待 Promise 完成，然后判断验证结果

## 使用 validate 方法

```js
schema.validate('Alice')
  .then(() => console.log('验证通过'))
  .catch(err => console.log(err.errors));
```

* `validate` 默认返回 Promise
* 异步验证和同步验证逻辑一致，只是异步需使用 `then/catch` 或 `async/await`

## 小结

* 异步验证适合检查数据库、接口或远程资源
* 使用 `test` + 异步函数即可实现
* Yup 会正确处理 Promise，保证验证结果可靠
