我的应用程序的许多地方的减速板出现很多错误,说:
Cannot refetch a query that has not been started yet.
我环顾四周,没有找到重现的方法。 我假设错误是由 RTK
refetch()
或给查询的 pollingInterval
引起的。
我不知道是否有人有同样的问题,或者这是否是一个已知问题。
由于我真的不知道是什么原因导致了问题,而且错误是最近才开始出现的,我想这可能是由 RTK 或其他原因引起的。
我还想这可能是由一些
useEffects
造成的,就像这样:
useEffect(() => {
if (user?.team !== userTeamRef.current) {
refetch();
userTeamRef.current = user?.team === undefined ? null : user.team;
}
}, [user?.team, refetch]);
更新:
所以我能够重现该错误:
const [joinTeam ] = useJoinTeamMutation();
const { refetch } = useGetTeam(slugName);
const onClick = () => {
leaveTeam().then((res: any) => {
if (!res.error) {
refetch();
}
});
};
当使用 Promise 调用重新获取时,它会抛出错误。
重新获取只能对已经获取的数据进行,如果没有初始化则不起作用。所以你可能想尝试以下方法:
const { refetch, isUninitialized } = useGetTeam(slugName);
const refetchTeam = useCallback(() => {
if (!isUninitialized) {
refetch();
}
}, [isUninitialized, refetch]);
const onClick = () => {
leaveTeam().then((res: any) => {
if (!res.error) {
refetchTeam();
}
});
};
调用
refetch()
的另一种方法是使相应的标签无效。例如
const onClick = () => {
leaveTeam().then((res: any) => {
if (!res.error) {
dispatch(yourApi.util.invalidateTags([{type:'team', slugName}]));
}
});
};
当然前提是你的API提供了相应的标签,例如:
getTeam: builder.query<Team, string>({
query: (slugName) => '.....',
providesTags: (_result, _error, slugName) => [{type: 'team', slugName}]
})