async/await 通过将异步操作包装为 promise 并用 await 暂停执行,使代码呈同步风格:async 函数自动返回 promise、支持 await;await 后跟 promise,暂停当前函数但不阻塞线程;错误用 try/catch 捕获;并发用 promise.all()。

用 async/await 写出同步风格的异步代码,核心是:把异步操作包装成 Promise,用 await 暂停执行等待结果,同时保持函数体内的代码看起来像同步流程——不写回调、不链 .then,逻辑直来直去。
async 函数是基础容器
async 关键字必须放在函数声明前,它让函数自动返回一个 Promise,并允许内部使用 await。普通函数里不能用 await。
- 如果 async 函数返回值不是 Promise,JS 会自动用
Promise.resolve()包一层 - 如果 async 函数抛错,等价于返回
Promise.reject(err) - 示例:✅ 正确:
async function fetchUser() { return await fetch('/api/user'); } - 示例:❌ 错误:
function foo() { await fetch('/api/user'); }(语法报错)
await 只能暂停当前 async 函数的执行
await 后面跟的是 Promise(或任意值),它会让 JS 引擎“暂停”当前 async 函数的执行,把控制权交还给事件循环,等 Promise settled(fulfilled 或 rejected)后再继续向下运行 —— 这个暂停对代码结构是透明的,就像同步语句一样逐行读。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
await不会阻塞整个线程,只是暂停当前函数;其他任务照常运行 - 不能在顶层作用域直接写
await(ES2022 起支持顶层 await,但仅限模块内,且有环境限制) - 常见写法:
const data = await fetch('/api').then(r => r.json());或更推荐:const res = await fetch('/api'); const data = await res.json();
错误处理用 try/catch,不用 .catch
因为 await 让异步调用“看起来像同步”,所以自然用同步风格的 try/catch 捕获异常,比链式 .catch() 更直观、嵌套更少。
- 被
await的 Promise reject 时,会抛出错误,被最近的try/catch捕获 - 可以统一处理多个 await 调用的失败:
try { const a = await api1(); const b = await api2(); } catch (err) { console.error('任一请求失败:', err); } - 若需区分不同请求的错误,可为每个 await 单独加 try/catch,或检查 err 状态码
并发请求用 Promise.all + await
想同时发起多个异步操作(比如并行拉取用户、订单、配置),不要写多个独立 await(那会变成串行)。用 Promise.all() 包装后 await,就能真正并发执行。
- 示例:
const [user, orders, config] = await Promise.all([fetchUser(), fetchOrders(), fetchConfig()]); - 注意:Promise.all 遇到任意一个 reject 就整体失败;如需“全都要,失败也不中断”,可用
Promise.allSettled() - 想控制并发数量(比如同时最多 3 个请求),需额外封装,例如用 p-limit 库或手写批处理逻辑










