Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从React query中的另一个查询的重试中重新提取不同的查询_Javascript_Reactjs_React Query - Fatal编程技术网

Javascript 从React query中的另一个查询的重试中重新提取不同的查询

Javascript 从React query中的另一个查询的重试中重新提取不同的查询,javascript,reactjs,react-query,Javascript,Reactjs,React Query,在我的解决方案中,我将React Query的useQuery钩子包装在自己的钩子中,以具有特定的重试逻辑: 导出函数useMyQuery(键,queryFn,选项={}){ const queryClient=useQueryClient(); const query=useReactQuery(key,queryFn{ …选项, 重试:异步(计数,错误)=>等待重试(计数,错误,查询客户端), }); 返回查询; } 重试功能本身如下: 导出异步函数重试(计数、错误、查询客户端){ 如果(

在我的解决方案中,我将React Query的
useQuery
钩子包装在自己的钩子中,以具有特定的重试逻辑:

导出函数useMyQuery(键,queryFn,选项={}){
const queryClient=useQueryClient();
const query=useReactQuery(key,queryFn{
…选项,
重试:异步(计数,错误)=>等待重试(计数,错误,查询客户端),
});
返回查询;
}

重试
功能本身如下:

导出异步函数重试(计数、错误、查询客户端){
如果(错误?.statusCode==401){
//捕获401,尝试刷新令牌;
if(等待刷新令牌(queryClient)){
queryClient.refetchQueries('fetchSession');
返回true;
}
}
//重试3次
返回计数<3;
}
最后,我的
fetchSession
查询如下所示:

const{data}=useQuery('fetchSession',()=>{
log('fetching new session…');
返回Auth.currentSession();
})

我的目标是在成功刷新上述代码中的令牌后触发“fetchSession”查询的重新蚀刻,但是,查询永远不会重新蚀刻,即在刷新令牌后永远不会运行查询体。除了在
queryClient
上使用
refetchQueries
方法外,我还尝试了
invalidateQueries
,但没有任何效果。

重试函数不是异步的-它希望您返回一个
布尔值,而不是
承诺
,因此这不起作用

我可以使用axios拦截器(如果您正在使用该拦截器)或仅在您的queryFn中执行此逻辑:

useQuery('fetchSession', async () => {
 try {
   const { data } = await axios.get(...)
   return data
 } catch(error) {
    if (error.statuscode === 401) {
        const token = await refreshToken(queryClient))
        const { data } = await axios.get(...) // pass token here? don't know how this works for you :)
        return data
    } else {
        throw error
    }
 }
})