await 后跟普通值时,JavaScript 会立即用 Promise.resolve() 包装并同步返回结果,不阻塞线程;因其符合规范对非 Promise 值的自动转换要求,故可直接 await。
await 后面跟普通值(非 Promise)时,JavaScript 会立即将该值包装成已解决(fulfilled)的 Promise,并同步返回其结果。 它不会阻塞线程,也不会等待,只是走完 Promise 处理的标准化流程。
因为规范规定:如果 await 后的表达式不是 Promise,引擎会自动调用 Promise.resolve(value) 将其转为一个已兑现的 Promise。之后按 Promise 的规则继续执行后续代码(即进入微任务队列后立即 resolve)。
例如:
let x = await 123;等价于:
立即学习“Java免费学习笔记(深入)”;
let x = await Promise.resolve(123);Promise.resolve() 包装虽然语法一致,但行为不同:
try/catch 依然能捕获它抛出的同步错误(比如 await undefined.foo 会 throw TypeError)const x = 42; 而非 const x = await 42;)