当前位置: 首页 > news >正文

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

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

PS:由于useState是一个普通的函数, 定义为() => 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);};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 压缩包方式windows安装mysql
  • ORBSLAM3 ORB_SLAM3 Ubuntu20.04 ROS Noetic 虚拟机镜像 下载
  • 【漏洞复现】Netgear WN604 downloadFile.php 信息泄露漏洞(CVE-2024-6646)
  • CCF-CSP认证考试 202406-2 矩阵重塑(其二) 100分题解
  • 如何查看jvm资源占用情况
  • JavaScript(11)——对象
  • SSD基本架构与工作原理
  • MongoDB教程(十一):MongoDB关系管理与文档关联
  • 加密传输及相关安全验证:
  • bash 笔记
  • Web开发:xmlns解析
  • SpringBoot:SpringBoot通过注解监测Controller接口
  • 使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题
  • 用PyTorch从零开始编写DeepSeek-V2
  • React antd form表单未保存跳转页面提示
  • Git 使用集
  • maya建模与骨骼动画快速实现人工鱼
  • Python - 闭包Closure
  • Python利用正则抓取网页内容保存到本地
  • 产品三维模型在线预览
  • 基于Android乐音识别(2)
  • 聊聊directory traversal attack
  • 前端之React实战:创建跨平台的项目架构
  • 全栈开发——Linux
  • 数据仓库的几种建模方法
  • 学习Vue.js的五个小例子
  • 在Docker Swarm上部署Apache Storm:第1部分
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 国内开源镜像站点
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • (2)(2.10) LTM telemetry
  • (27)4.8 习题课
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二)原生js案例之数码时钟计时
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (六)DockerCompose安装与配置
  • (六)Hibernate的二级缓存
  • (转)程序员技术练级攻略
  • (转)人的集合论——移山之道
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • 、写入Shellcode到注册表上线
  • .NET CF命令行调试器MDbg入门(一)
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .net后端程序发布到nignx上,通过nginx访问
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • :class的用法及应用
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • @selector(..)警告提示
  • [ C++ ] STL_list 使用及其模拟实现
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...