async 声明异步函数,自动将返回值包装为 Promise;await 仅在 async 函数内使用,以同步风格等待 Promise 结果;async 不改变同步代码执行时机,无法使阻塞操作变为非阻塞。

async 关键字本身不会“转换”普通函数,而是**声明一个异步函数**,它会自动把函数的返回值包装成 Promise。只要在函数声明前加上 async,无论函数体内是否含 await,该函数就成为返回 Promise 的异步函数。
async 函数的返回值总是 Promise
即使函数体里没有 await,也没有异步操作,async 函数也会把返回值自动 Promise 化:
- 返回原始值(如
42、"ok")→ 自动变成Promise.resolve(42) - 返回一个已存在的 Promise → 直接返回该 Promise(不额外包装)
- 抛出错误 → 等价于返回
Promise.reject(error)
例如:
async function getValue() {
return "hello";
}
console.log(getValue()); // Promise { 'hello' }配合 await 让异步逻辑更自然
await 只能在 async 函数内部使用,用于等待 Promise 完成,并以同步风格获取结果:
立即学习“Java免费学习笔记(深入)”;
-
await somePromise会暂停函数执行,等 Promise settled 后继续 - 如果 Promise 成功,
await表达式结果就是 resolved 值 - 如果 Promise 失败,且未被
try/catch捕获,函数会立即 reject
例如:
async function fetchUser() {
try {
const res = await fetch('/api/user');
const user = await res.json();
return user; // 自动包装为 Promise.resolve(user)
} catch (err) {
throw new Error('Failed to fetch user');
}
}不能直接“改造”已有函数,但可以快速封装
你不能给普通函数加个 async 就让它变异步(比如 function foo(){}; async foo; 是语法错误)。正确做法是:
- 重写为
async function声明 - 或用箭头函数快速定义:
const asyncFoo = async () => { ... }; - 若需兼容同步逻辑,可保留原函数,另写一个
async版本调用它(例如返回Promise.resolve(syncFn()))
注意:async 不会让同步代码变异步
async 不会改变函数内部代码的执行时机。耗时的同步操作(如大循环、JSON.parse 大字符串)依然会阻塞主线程:
async function badExample() {
const t0 = Date.now();
while (Date.now() - t0 < 2000) {} // 这里会卡住 2 秒,不是异步!
return "done";
}真正异步需要依赖浏览器/Node.js 提供的异步 API(如 fetch、setTimeout、fs.promises.readFile 等),或手动用 Promise + setTimeout 等脱钩。


















