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

NextJS中含async与不含async的函数执行差异及相关疑问

关于async函数与同步执行的疑问解答

带async的函数:

export async function getPostData(id) {
    const fullPath = path.join(postsDirectory, `${id}.md`);
    const fileContents = fs.readFileSync(fullPath, 'utf8');
    const matterResult = matter(fileContents);
    return {
        id,
        ...matterResult.data,
    };
}

不带async的函数:

export function getPostData(id) {
    const fullPath = path.join(postsDirectory, `${id}.md`);
    const fileContents = fs.readFileSync(fullPath, 'utf8');
    const matterResult = matter(fileContents);
    return {
        id,
        ...matterResult.data,
    };
}

你的理解验证

你对不带async函数的理解是正确的:它会同步执行,每一行代码必须等上一行的操作完全完成后,才会执行下一行——比如fullPath生成后才会读取文件,文件读取完成后才会处理matterResult。

核心问题解答

  1. 能否在该async函数中不使用await关键字?
    可以,但完全没有必要,反而会带来不必要的复杂度。

  2. 不使用await会产生什么差异?
    async函数的本质是自动将返回值包装成Promise对象。哪怕你return的是普通对象,它也会被转换成Promise.resolve(返回值)的形式。

  • 调用不带async的getPostData(id),会直接拿到返回的普通对象;
  • 调用带async的getPostData(id),会拿到一个Promise实例,必须通过.then()或者await才能获取到内部的对象。
  1. async函数内的变量是否仍会同步执行?
    是的!async关键字仅改变函数的返回值类型(转为Promise),并不会改变函数内部同步代码的执行顺序。你代码里的path.join、fs.readFileSync、matter都是同步操作,不管函数有没有加async,都会按顺序一步步执行,完全不会出现“同时执行所有变量”的情况。

额外补充:如果你的函数内部没有任何异步操作(比如没有调用异步API、没有await其他Promise),那给函数加async完全是多余的,只会增加调用者的处理成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:37:23