javascript - 是的 - setTimeout 后的异步验证
问题描述
为了保存申请,下面的代码在用户输入值后使用 setTimeout。如果输入一个新的,超时被取消。
我想确认下面的方法是否正确,因为当超时被清除时,它不会像异步验证函数“test”所期望的那样返回 Promise。
let timeout = null;
const validationSchema = Yup.object({
name: Yup.string("Enter your name").required("Name is required"),
.test("checkDuplUsername", "Username already taken", function(value) {
clearTimeout(timeout);
if (!value) return true;
return new Promise((resolve, reject) => {
timeout = setTimeout(async () => {
let uname = value.trim().toLowerCase();
let resp = await fetch('/check_username/' + value;
resolve(resp.result.length === 0);
}, 500);
});
})
})
解决方案
您可以在超时后通过以下方式使用异步验证:
const validationSchema = Yup.object({
name: Yup.string("Enter your name").required("Name is required")
.test("checkDuplUsername", "Username already taken", function(value) {
if (!value) {
const isDuplicateExists = await checkDuplicate(value);
console.log("isDuplicateExists = ", isDuplicateExists);
return !isDuplicateExists;
}
// WHEN THE VALUE IS EMPTY RETURN `true` by default
return true;
}),
});
function checkDuplicate(valueToCheck) {
return new Promise(async (resolve, reject) => {
let isDuplicateExists;
setTimeout(() => {
// CHECK HERE FOR DUPLICATE
if (valueToCheck === "test") {
isDuplicateExists = true;
resolve(isDuplicateExists);
} else {
isDuplicateExists = false;
resolve(isDuplicateExists);
}
}, 3000)
});
}
推荐阅读
- sql - 无法识别表别名
- javascript - 结合vue和laravel的正确方法
- python - 尝试在 Python 中修改列表
- fosuserbundle - Symfony 4:如何覆盖 Fosuserbundle 验证?
- amazon-web-services - 如何获取当前 VPC 中的子网总数
- python - AttributeError:“dict_values”对象没有属性“更新”
- bash - 将 conky 对象传递给外部脚本
- perl - 使用 perl 为闪烁的光标生成 md5
- aop - Specman/e 约束(对于每个 in)迭代
- nginx - 即使 SSL 未开启,Nginx 仍为站点提供证书