如何在 Yup.test 上执行 setTimeout?

如何解决如何在 Yup.test 上执行 setTimeout?

我正在尝试验证地址:

  line1: Yup.string()
    .test(
      "Address Line 1 Validation Test","Please enter valid Line 1 address",async (line1: string) => {
        let delayTimer = null;
        let isValid = false;
        const doSearch = () => {
          clearTimeout(delayTimer);
          delayTimer = setTimeout(async () => {
            const { data } = await axios.get<{ status: string }>(
              "https://maps.googleapis.com/maps/api/geocode/json?components=country:USA",{
                params: {
                  address: line1,key: GEOCODE_API_KEY,},}
            );
            console.log("line1: ",line1);
            console.log("data: ",data);
            isValid = data.status === "OK" ? true : false;
          },1000); // Will do the ajax stuff after 1000 ms,or 1 s
        };
        doSearch();
        return isValid;
      }
    )
    .required("Line 1 is required"),

我想像这样集成延迟搜索,这样我就不会每次用户输入这样的 api:AJAX: Delay for search on typing in form field

但每次用户输入时它都会执行 api 请求。我如何实施?

解决方法

问题在于您实际上从未清除超时。

每次运行处理程序时,都会创建和初始化新的 delayTimerisValiddoSearch 变量。这些变量必须放在外部作用域中。像这样:

let delayTimer = null;
let isValid = false;

Yup.string()
    .test(
        'Address Line 1 Validation Test','Please enter valid Line 1 address',async (line1: string) => {
            clearTimeout(delayTimer);
            
            delayTimer = setTimeout(async () => {
                const {data} =
                    (await axios.get) <
                    {status: string} >
                    ('https://maps.googleapis.com/maps/api/geocode/json?components=country:USA',{
                        params: {
                            address: line1,key: GEOCODE_API_KEY
                        }
                    });
                console.log('line1: ',line1);
                console.log('data: ',data);
                isValid = data.status === 'OK';
            },1000); // Will do the ajax stuff after 1000 ms,or 1 s
            
            return isValid;
        }
    )
    .required('Line 1 is required');

现在,即使这解决了您最初的问题,还有另一个问题需要解决。您的函数将始终返回带有错误值 isValid 的承诺。

你必须做什么取决于你想要什么,但我会给你以下见解:

let delayTimer = null;
let isValid = false;
let resolveRef = null;

Yup.string()
    .test(
        'Address Line 1 Validation Test',async (line1: string) => {
            clearTimeout(delayTimer);

            if (resolveRef) {
                resolveRef(isValid);
                resolveRef = null;
            }

            return await new Promise((resolve) => {
                resolveRef = resolve;
                delayTimer = setTimeout(async () => {
                    const {data} =
                    (await axios.get) <
                    {status: string} >
                    ('https://maps.googleapis.com/maps/api/geocode/json?components=country:USA',{
                            params: {
                                address: line1,key: GEOCODE_API_KEY
                            }
                        });

                    isValid = data.status === 'OK';

                    resolve(isValid);
                    resolveRef = null;
                },1000);
            });
        }
    )
    .required('Line 1 is required');

希望它有效。请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?