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

为何在TanStack Query的queryFn中必须添加return语句?

TanStack Query调用getUserById后data返回undefined的原因及解决办法

问题核心

TanStack Query的queryFn要求返回一个Promise(或是async函数,因为async函数默认返回Promise),只有这样Query才能跟踪异步请求的状态并解析出返回数据。

不可行代码的问题

下面这段代码里,queryFn是普通函数,调用getUserById后没有返回这个异步操作的Promise:

const { data = [], isSuccess } = useQuery({
  queryKey: ['user'],
  queryFn: () => {
    if (userId) {
      getUserById(userId); // 仅调用async函数,未返回其Promise
    }
  },
 enabled: !!userId,
});

getUserById是async函数,调用后会生成一个Promise,但因为queryFn没有return这个Promise,它的返回值就是undefined。TanStack Query无法从undefined中解析出数据,因此data会是undefined。

可行代码的正确逻辑

这段代码的queryFn是async函数,内部await了getUserById的结果并返回:

export const getUserById = async (userId: string) => {
  try {
    const response = await axios.get(`${API_URL}/user/${userId}`);
    return response.data;
  } catch (err) {
    console.log(err);
  }
};
const { data = [], isSuccess } = useQuery({
    queryKey: ['user'],
    queryFn: async () => {
      if (userId) {
        const user = await getUserById(userId);
        return user;
      }
    },
    enabled: !!userId,
});
  • async函数会自动把返回值包装成Promise,TanStack Query能正确接收这个Promise,等待异步操作完成后解析出response.data,最终data就能拿到用户信息。
  • 即使不使用await,直接return getUserById(userId)也能正常工作,因为getUserById本身返回的就是Promise:
    queryFn: () => {
      if (userId) {
        return getUserById(userId); // 直接返回Promise
      }
    }
    

额外提醒

如果getUserById的catch块没有抛出错误,TanStack Query无法感知请求失败。建议在catch中抛出错误,让Query的错误状态(isError、error)能正常触发:

export const getUserById = async (userId: string) => {
  try {
    const response = await axios.get(`${API_URL}/user/${userId}`);
    return response.data;
  } catch (err) {
    console.error(err);
    throw err; // 抛出错误,让TanStack Query捕获
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:13:27