Redux Toolkit设置skip参数后仍同时触发多个RTK Query请求如何解决
问题根因
首次渲染时useGetTestsQuery返回的data为undefined,此时第二个查询的skip: data判定结果为false,两个查询会同时触发,只有等第一个查询返回、data赋值后,第二个查询的skip才会生效,因此会出现两个请求并行的情况。
修复方案
方案1:优先走第一个查询,失败/无返回时再走第二个
调整第二个查询的skip逻辑,只要第一个查询正在请求、或已拿到有效数据,就跳过第二个:
const { data, isFetching, isSuccess, isError } = useGetTestsQuery(filters, { pollingInterval: 5000 }); const { data: testsByStatus, isFetching: fetchDataByStatus } = useGetTestsByStatusQuery(filters, { pollingInterval: 5000, // 第一个有数据、请求中、请求成功时都跳过第二个,仅第一个失败时才触发 skip: !!data || isFetching || (isSuccess && !isError) }); return <Table columns={columns} dataSource={data || testsByStatus} />;
方案2:两个查询完全互斥
如果需求是任意一个查询返回数据后,另一个就不再触发,可给两个查询都加skip规则,同时给第一个查询设置优先级,避免初始并行:
const { data, isFetching: isFetchingFirst } = useGetTestsQuery(filters, { pollingInterval: 5000, skip: !!testsByStatus // 第二个有数据时跳过第一个 }); const { data: testsByStatus, isFetching: isFetchingSecond } = useGetTestsByStatusQuery(filters, { pollingInterval: 5000, // 第一个有数据、或第一个正在请求中时,跳过第二个 skip: !!data || isFetchingFirst }); return <Table columns={columns} dataSource={data || testsByStatus} />;
优化建议
如果两个接口返回的结构可复用,更推荐直接在RTK Query的接口定义中用transformResponse参数将两个接口逻辑合并为一个查询,减少组件内的冗余判断。
内容的提问来源于stack exchange,提问作者Errand
相关产品推荐
相关产品推荐

