You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在useMutation的onSuccess中调用useQuery并等待其结果?

解决登录成功后等待useQuery查询完成再跳转的问题

方案1:利用refetch的异步返回值(推荐)

refetch()方法本身返回一个Promise,会在查询完成后返回结果,直接在onSuccess里用async/await等待查询结束,就能拿到最新的查询数据,不用依赖组件的data变量。

修改后的代码:

const { data, refetch } = useQuery(["tracks"], getTracks, {
  enabled: false,
});

const { mutate, isLoading, isError, error } = useMutation(login, {
  async onSuccess(d, v, c) {
    Cookies.set("cookieToken", d?.access);

    const token = Cookies.get("cookieToken");
    const { user_type: type } = parseJwt(token);
    
    // 等待refetch完成,直接获取查询结果
    const { data: tracksData } = await refetch();

    if (tracksData) {
      const targetPath = `/${tracksData.object[0].id}?type=${type === 5 || type === 6 ? 'prio' : 'filtering'}`;
      navigate(targetPath);
    }
  },
});

方案2:通过状态监听实现跳转

如果不想用异步语法,可以把用户类型存在组件状态里,然后监听查询数据和用户类型的变化,当两者都就绪时触发跳转。

修改后的代码:

import { useState, useEffect } from 'react';

// ...

const [userType, setUserType] = useState(null);
const { data: tracksData, refetch } = useQuery(["tracks"], getTracks, {
  enabled: false,
});

const { mutate, isLoading, isError, error } = useMutation(login, {
  onSuccess(d, v, c) {
    Cookies.set("cookieToken", d?.access);

    const token = Cookies.get("cookieToken");
    const { user_type: type } = parseJwt(token);
    setUserType(type);
    
    // 触发数据查询
    refetch();
  },
});

// 监听数据和用户类型,满足条件时跳转
useEffect(() => {
  if (tracksData && userType) {
    const targetPath = `/${tracksData.object[0].id}?type=${userType === 5 || userType === 6 ? 'prio' : 'filtering'}`;
    navigate(targetPath);
  }
}, [tracksData, userType, navigate]);

两种方案各有适用场景:方案1逻辑更集中,适合一次性完成的流程;方案2把状态拆分,方便后续在组件其他地方复用用户类型或查询数据。

内容的提问来源于stack exchange,提问作者Mohamed Nabil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:12:39