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

useQuery场景下.then与async/await的功能差异问询

useQuery回调中.then与async/await写法的功能差异

VS Code提示以下useQuery的回调函数可改为async函数(因其返回Promise):

const { isLoading, refetch } = useQuery(['FETCH CUSTOMERS', page], () => {
  return getCustomersList(page, 100, createQuery(filters)).then(
    ({ rows = 1, totalPages: newTotalPages = 1 }) => {
      if (totalPages !== newTotalPages) {
        setTotalPages(newTotalPages);
      }
      dispatch(loadCustomers(rows));
    }
  );
});

问题:上述场景中,使用.then和用await等待Promise返回后处理的效果是否一致?换成以下async/await写法是否会产生功能差异?

const { isLoading, refetch } = useQuery(['FETCH CUSTOMERS', page], async () => {
  return await getCustomersList(page, 100, createQuery(filters)).then(
    ({ rows = 1, totalPages: newTotalPages = 1 }) => {
      if (totalPages !== newTotalPages) {
        setTotalPages(newTotalPages);
      }
      dispatch(loadCustomers(rows));
    }
  );
});

结论:两种写法功能完全一致,无差异

原因如下:

  • 原始写法中,回调直接返回getCustomersList().then(...),而.then()本身就返回Promise,完全符合useQuery对回调的要求(返回Promise或同步值)。
  • 修改后的async函数写法里,async关键字会自动将函数返回值包装为Promise;而await getCustomersList(...).then(...)本质是等待.then()返回的Promise完成后,再返回其结果——最终async函数返回的Promise和原始写法的返回值完全等价。

更优的写法建议

可以去掉多余的.then(),用await直接解构返回值,让代码逻辑更线性、可读性更强,写法如下:

const { isLoading, refetch } = useQuery(['FETCH CUSTOMERS', page], async () => {
  const { rows = 1, totalPages: newTotalPages = 1 } = await getCustomersList(page, 100, createQuery(filters));
  if (totalPages !== newTotalPages) {
    setTotalPages(newTotalPages);
  }
  dispatch(loadCustomers(rows));
});

这种写法和前两种功能完全一致,但代码结构更清晰,是async/await的典型优势用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:15:29