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。
核心问题解答
能否在该async函数中不使用await关键字?
可以,但完全没有必要,反而会带来不必要的复杂度。不使用await会产生什么差异?
async函数的本质是自动将返回值包装成Promise对象。哪怕你return的是普通对象,它也会被转换成Promise.resolve(返回值)的形式。
- 调用不带
async的getPostData(id),会直接拿到返回的普通对象; - 调用带
async的getPostData(id),会拿到一个Promise实例,必须通过.then()或者await才能获取到内部的对象。
- async函数内的变量是否仍会同步执行?
是的!async关键字仅改变函数的返回值类型(转为Promise),并不会改变函数内部同步代码的执行顺序。你代码里的path.join、fs.readFileSync、matter都是同步操作,不管函数有没有加async,都会按顺序一步步执行,完全不会出现“同时执行所有变量”的情况。
额外补充:如果你的函数内部没有任何异步操作(比如没有调用异步API、没有await其他Promise),那给函数加async完全是多余的,只会增加调用者的处理成本。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

