async函数无论是否使用await,其返回值总是Promise。这是因为async函数本质是Promise包装器:正常return被Promise.resolve()包装,throw等价于Promise.reject(),空return也返回Promise.resolve(undefined)。

在 JavaScript 中,async 函数无论内部是否使用 await,其返回值总是 Promise。这是 async 函数的底层机制决定的,不是靠 await “触发” 的。
async 函数的本质就是 Promise 包装器
当你声明一个函数为 async,JavaScript 引擎会自动把它包装成一个返回 Promise 的函数:
- 如果函数正常 return 一个值(比如
return 42),引擎会自动用Promise.resolve(42)包一层,返回 fulfilled 状态的 Promise; - 如果函数中 throw 错误,等价于返回
Promise.reject(err); - 即使函数体为空或只写
return;,也等价于return Promise.resolve(undefined)。
不写 await 不影响返回 Promise,只影响执行时机
await 只是让函数内部暂停等待 Promise 解决,但它不决定“是否返回 Promise”。例如:
async function f1() {
return 'hello'; // 没有 await,但依然返回 Promise<string>
}
console.log(f1()); // Promise {"hello"}
async function f2() {
return Promise.resolve('world'); // 返回 Promise,async 再包一层 → Promise<Promise<string>>
}
console.log(f2()); // Promise {Promise {"world"}}
注意:f2 中手动返回 Promise,async 仍会再包一层,造成 Promise 嵌套(通常应避免)。
立即学习“Java免费学习笔记(深入)”;
如何得到原始值?必须用 await 或 .then()
因为 async 函数返回的永远是 Promise,所以要拿到里面的值,必须异步处理:
- 在另一个 async 函数里:用
const val = await f1(); - 在普通函数里:用
f1().then(val => console.log(val)); - 不能直接写
const x = f1(); console.log(x);—— x 是 Promise,不是 'hello'。
常见误解澄清
有人以为 “没写 await 就不是异步”,其实不对:
- async 函数本身是同步执行到第一个 await(或结束),但返回结果一定是 Promise;
- 哪怕函数里全是同步代码,返回值也经过 Promise 化处理;
- 这是语言规范强制行为,和你有没有 await 无关。


















