【safari】在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决

在safari浏览器中,可能会遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。

PS:由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时

有问题的代码:

我们可以看到,setTimeout只传0,这个时候在谷歌浏览器是有效果的,能确保顺序正确,但是在safari浏览器下,obj的值没有办法及时更新上state。

const columnsChange = ({ key, val }: { key: string | number; val: any }) => {
        const obj = {
            [key]: Array.isArray(val) && val?.length > 0 ? val : undefined
        };
        setFilters((f) => ({ ...f, ...obj }));
        setPagination({ pageNo: 1, pageSize: PAGE_SIZE });
        setTimeout(() => {
            run();
        }, 0);
    };

修改后的代码:

于是,我们尝试使用await/async去处理异步,但是由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时。因此不能这样做!

const columnsChange = async ({ key, val }: { key: string | number; val: any }) => {
        const obj = {
            [key]: Array.isArray(val) && val?.length > 0 ? val : undefined
        };
        // 由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时
        await setFilters((f) => ({ ...f, ...obj }));
        setPagination({ pageNo: 1, pageSize: PAGE_SIZE });
        run();
    };
验证:我们通过查看useState的定义,查看Dispatch、SetStateAction的定义,可以看到都是() => void或者返回泛型S(这意味着如果我们要变更的状态不是promise,也不适用await写法)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正确的代码:

将异步时间微调大一些200ms

const columnsChange = ({ key, val }: { key: string | number; val: any }) => {
        const obj = {
            [key]: Array.isArray(val) && val?.length > 0 ? val : undefined
        };
        // 由于setState是一个普通的函数, 定义为() => void;因此此处不能用await/async替代setTimeout,只能用在返回值为Promise时
        setFilters((f) => ({ ...f, ...obj }));
        setPagination({ pageNo: 1, pageSize: PAGE_SIZE });
        setTimeout(() => {
            run();
        }, 200);
    };

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 21:00:06       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 21:00:06       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 21:00:06       57 阅读
  4. Python语言-面向对象

    2024-07-15 21:00:06       68 阅读

热门阅读

  1. 08-8.3.1 冒泡排序

    2024-07-15 21:00:06       14 阅读
  2. docker 容器内部UI映射host

    2024-07-15 21:00:06       21 阅读
  3. 2024 7.8~7.14 周报

    2024-07-15 21:00:06       17 阅读
  4. [C/C++入门][循环]14、计算2的幂(2的n次方)

    2024-07-15 21:00:06       19 阅读
  5. 云原生周刊:Score 成为 CNCF 沙箱项目|2024.7.15

    2024-07-15 21:00:06       28 阅读
  6. 数据分析——Python网络爬虫(四){爬虫库的使用}

    2024-07-15 21:00:06       19 阅读
  7. 数据分析_计划

    2024-07-15 21:00:06       22 阅读
  8. FPGA之术语

    2024-07-15 21:00:06       18 阅读
  9. [C++ 基础入门 - inline和 nullptr]

    2024-07-15 21:00:06       17 阅读
  10. STL常用容器及使用总结

    2024-07-15 21:00:06       21 阅读
  11. MiniCPM-V

    MiniCPM-V

    2024-07-15 21:00:06      20 阅读
  12. Mybatis

    Mybatis

    2024-07-15 21:00:06      18 阅读
  13. ORA-12518: TNS: 监听程序无法分发客户机连接

    2024-07-15 21:00:06       14 阅读