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

为何React中调用async函数需额外async/await,纯JS却无需?

为什么纯JS直接调用async函数能打印数据,React的useEffect里却只拿到Promise?

核心结论:async函数始终返回Promise,两个场景的差异在于你处理数据的位置和方式,而非环境本身。

纯JS场景的本质

你在纯JS文件里的代码逻辑是这样的:

const fetchData = async () => {
  const res = await fetch('https://601caf791a9c220017060c02.mockapi.io/api/v1/Events');
  const data = await res.json();
  console.log(data); // 数据处理和打印都在函数内部完成
}

fetchData()

这里你根本没关心fetchData()返回的Promise——因为你要的打印操作已经在async函数内部通过await拿到数据后执行了。调用fetchData()只是触发这个异步流程,你不需要从外部获取它的返回值,所以不需要额外的async/await。

React场景的问题

你的React代码把fetchData改成了返回数据的函数:
api.js:

export const fetchData = async () => {
  const res = await fetch(
    "https://601caf791a9c220017060c02.mockapi.io/api/v1/Events"
  );
  const data = await res.json();
  return data; // 函数返回的是被Promise包裹的数据
};

App.js里调用时:

useEffect(() => {
  const results = fetchData();
  console.log(results); // 直接打印了fetchData返回的Promise对象
}, [])

因为async函数的特性,不管你内部return的是什么值,最终都会被自动包裹成Promise返回。你直接打印这个返回值,自然看到的是Promise,而非实际数据。

为什么加async/await就可以?

要拿到Promise内部的数据,必须用await去解析它。在useEffect里可以这么写:

useEffect(() => {
  // 定义内部async函数处理异步逻辑
  const loadData = async () => {
    const results = await fetchData();
    console.log(results); // 这里拿到的就是实际数据
  };
  loadData();
}, [])

注意:不能直接把useEffect的回调设为async函数,因为React要求useEffect的回调要么返回清理函数,要么不返回任何值,返回Promise会触发控制台警告。

总结

  • 纯JS场景:你在async函数内部完成了数据处理,不需要依赖函数返回值,所以看起来“不用额外async/await”。
  • React场景:你需要从async函数的返回值里拿数据,就必须用await解析它返回的Promise,才能拿到实际内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:18:26