async函数自动返回Promise,无论是否有await;await可适配任意值为Promise;Promise本身不会自动变为async函数,二者是单向隐式转换关系。

async 函数会自动包装成 Promise,不需要手动 new Promise;Promise 对象本身不自动变成 async 函数,但可以被 await 直接消费。这个转换不是双向的,而是单向、隐式、有规则的。
async 函数自动返回 Promise
只要函数用 async 声明,无论函数体里有没有 await,它调用后一定返回一个 Promise 实例:
- 函数正常 return 一个值(比如
return 42),等价于Promise.resolve(42); - 函数中 throw 错误,等价于
Promise.reject(new Error(...)); - 函数没有显式 return,返回的是
Promise.resolve(undefined); - 即使内部全是同步代码,比如
async function f() { console.log('hi'); return 'ok'; },调用f()依然得到 Promise,不是字符串。
await 会“适配”任何值为 Promise
await 并不挑食——它后面跟的不一定是 Promise,但会被统一处理成 Promise:
- 如果是 Promise(如
await fetch('/api')),就等待它 resolve 或 reject; - 如果是普通值(如
await 123),JS 自动用Promise.resolve(123)包一层,然后立即 resolve; - 如果是 thenable 对象(有
then方法的对象),也会被当作 Promise 处理; - 但注意:await 只能在 async 函数内部使用,否则语法报错。
Promise 不会自动变成 async 函数
Promise 是对象,async 是函数声明方式,二者角色不同:
- 写
const p = new Promise(...),p 就是个 Promise,它本身不是函数,更不是 async 函数; - 你不能对 p 加
async,也不能直接await p以外的地方“升级”它; - 想让 Promise 的逻辑可复用、可 await,得把它封装进 async 函数里,例如:
async function getUser() { return await fetch('/user').then(r => r.json()); } - 换句话说:Promise 是“值”,async 函数是“能产出 Promise 的工厂”。
实际协作时的关键细节
async/await 和 Promise 经常嵌套配合,理解转换边界能避免常见陷阱:
- 多个 await 是串行执行的,但每个 await 后面的表达式仍可能返回 Promise,所以底层仍是 Promise 链;
- 错误捕获建议用 try/catch(对应 await),或在 async 函数返回的 Promise 上链式调用 .catch();
- 不要在循环里无节制 await(如 for 循环逐个请求),容易阻塞;需要并发时用
Promise.all([...]); - await 后面的 Promise 如果被 reject,且没被 try/catch 捕获,会导致整个 async 函数返回 rejected Promise。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











