胶州为企业做网站的公司,苏州建行网站首页,网络营销平台策略,出国劳务信息网在safari浏览器中#xff0c;可能会遇到异步时间差的问题#xff0c;导致状态没有及时更新到state#xff0c;引起传参错误。
PS#xff1a;由于useState是一个普通的函数#xff0c; 定义为() void;因此此处不能用await/async替代setTimeout#xff0c;只能用在返…在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);};