await挂起异步函数执行上下文而非线程,只能用于async函数内,等待Promise或thenable对象。后续代码作为微任务在Promise解决后立即调度,不阻塞主线程。避免对非Promise值(如setTimeout)使用await,否则会同步返回且后续代码同步执行,应包裹在Promise中。
await 的正确用法await 挂起的是异步函数的执行上下文,而不是线程——这个区别很关键。JavaScript 本质上跑在单线程上,哪来的线程可以让你挂起?何况,await 只能在 async 函数里使用,它等待的是一个 Promise 或 thenable 对象,后续的代码会被当作微任务来调度,绝不会阻塞主线程。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
说得更直白一点:await 不会“冻结”整个线程,它只是让当前函数的执行暂时停下来,把控制权交还给事件循环,好让其他任务有机会跑一跑。很多人一上来就说“await 挂起线程”,这其实是一个常见的误解,毕竟 JavaScript 压根就没有真正的线程概念(主线程上不存在多线程抢占)。
这条是语法层面的硬性规定。如果你在普通函数或者顶层作用域里直接写 await somePromise(),编译器会毫不留情地抛出语法错误。
async function foo() { await fetch('/api'); }function bar() { await fetch('/api'); }(立即报 SyntaxError)await 只在 ESM 模块作用域下才被允许使用,这不等于在普通脚本里可以随便乱写await 后面的表达式会被自动调用 Promise.resolve() 进行包装。它真正等待的是这个 Promise 进入 fulfilled 或 rejected 状态。
await 123 → 等价于 await Promise.resolve(123),实际上会立刻继续往下执行await fetch(url) → 等待网络响应返回 Response 对象await new Promise(r => setTimeout(r, 1000)) → 等待 1 秒后 Promise 状态变为 fulfilled,然后继续执行这一点尤其值得注意。当 await 后面的 Promise 完成之后,它后面的代码并不会像同步代码那样立刻执行,而是会被当作一个微任务(microtask)来调度,等到当前所有同步代码执行完毕、在下一次宏任务(比如 setTimeout 的回调)之前才会被执行。
await 不会阻塞浏览器的渲染,也不会干扰用户的交互响应,UI 依然可以流畅运作await 串行执行时,每一个 await 都会暂时“暂停”当前函数的执行体,但并不会冻结整个 JavaScript 引擎await a(); console.log('1'); await b(); console.log('2'); 这里的执行顺序是——'1' 一定在 a() 返回的 Promise 变成 fulfilled 之后才打印,'2' 同理,保证严格的先后顺序比如 await setTimeout(...) 这种做法完全是无效的——setTimeout 返回的是一个定时器 ID(一个数字),并不是 Promise,await 看到这个数字会立刻解包并继续往下走,根本达不到你想要延时执行的效果。
await new Promise(r => setTimeout(r, 1000));await setTimeout(() => {}, 1000);(完全不起作用)await 并不会带来性能损失,但如果对一个纯粹的同步值(比如字符串、字面量对象)使用 await,那其实完全没有必要理解 await 的本质——它是用来“暂停函数执行、交还控制权、等待 Promise 状态确定后再恢复执行”——这个认知比单纯记住“挂起线程”要准确得多,也实用得多。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述