事件循环执行顺序为:同步代码→清空微任务→执行一个宏任务→再清空微任务→循环;宏任务含script、settimeout等,微任务含promise.then、async/await等;每轮仅取一个宏任务,但清空全部微任务。

直接从执行顺序切入,比死记概念快得多。核心就一条:同步代码走完 → 清空所有微任务 → 执行一个宏任务 → 再清空微任务 → 循环。Promise 和 async/await 的行为,全由这个节奏决定。
先搞清任务队列的优先级
宏任务和微任务不是并列关系,而是有明确执行次序:
- 宏任务包括:script 全局脚本、setTimeout、setInterval、I/O、UI 渲染、DOM 事件回调
- 微任务包括:Promise.then/catch/finally、async/await 后续逻辑、queueMicrotask()
- 关键规则:每轮事件循环只取一个宏任务,但会一次性清空全部微任务(包括执行中产生的新微任务)
Promise 状态与链式调用的本质
Promise 不是“自动异步”,它只是把回调组织得更可控:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- new Promise(fn) 中的 fn 是同步执行的,resolve/reject 一调就改状态
- .then()/.catch() 返回的新 Promise 状态,取决于回调函数的返回值或抛错:正常返回 → fulfilled;throw 错误 → rejected;返回 Promise → 等它结果
- 错误不会自动跨 .then 传递,除非上一个 .then 抛错,或用 .catch 捕获后没再 throw
async/await 是 Promise 语法糖,不是新机制
写 async 函数,等于在内部用 Promise 封装 + 自动 await 处理:
- await 后面如果不是 Promise,会被自动包装成 Promise.resolve(x),所以 await 100 等价于 await Promise.resolve(100)
- await 一旦遇到 rejected Promise,且没被 try/catch 包住,就会让整个 async 函数返回 rejected 状态
- 多个 await 是串行的;想并行,得用 Promise.all([p1, p2]) 包一层再 await
错误处理要分层落地
错误不消失,只是换地方冒泡:
- Promise 链中,.catch() 只捕获前面未处理的 reject,它之后的 .then 仍可执行
- async 函数里,try/catch 捕的是 await 抛出的错误,不是 Promise 状态本身
- 全局未捕获错误(unhandledrejection)会触发 window.addEventListener('unhandledrejection'),这是兜底防线










