await 后可跟任意值,引擎自动用 promise.resolve() 包装为已解决的 promise 并同步返回原始值,不触发异步等待;常用于统一处理可能为 promise 或普通值的变量,但应避免无意义 await 普通值。

await 后面可以跟任何值,不只是 Promise 对象。JavaScript 引擎会自动把非 Promise 值包装成已解决(resolved)的 Promise,然后立即返回该值。
await 对非 Promise 值的处理机制
当 await 遇到非 Promise 值(如字符串、数字、对象、undefined、null 等),它会:
- 调用
Promise.resolve(value)将该值转为一个已完成状态的 Promise - 立即 resolve 并返回原始值(不是 Promise 实例,而是你传入的那个值)
- 不会造成实际等待,执行是同步的,只是语法上看起来像“暂停”
常见非 Promise 场景示例
以下写法都是合法且常用的:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
const a = await 'hello';→a是字符串'hello' -
const b = await 42;→b是数字42 -
const c = await { name: 'Alice' };→c是该对象 -
const d = await undefined;→d是undefined -
const e = await null;→e是null
和 Promise 的行为对比
关键区别在于执行时机:
-
await Promise.resolve(123):创建 Promise 后 resolve,微任务队列中执行,有异步调度 -
await 123:直接等价于Promise.resolve(123).then(v => v),但引擎优化后不进微任务队列,表现上是同步返回
你可以用 console.log 和 setTimeout(() => ..., 0) 验证:await 非 Promise 值后的代码会紧接当前宏任务执行,不被推迟到下一轮微任务。
实用建议
虽然技术上允许 await 任意值,但应保持语义清晰:
- 避免无意义地 await 普通值(如
await 'loading...'),容易误导读者以为有异步操作 - 适合用于统一处理可能为 Promise 或普通值的变量,比如函数返回值不确定时:
const data = await maybePromiseOrValue; - 配合工具函数做防御性编程,例如封装
async function safeAwait(val) { return await val; }来兼容两种类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










