Appearance
Promise 与 async/await:状态机、错误传播与并发组织
主题边界
- Promise 的价值在于表达一次异步计算的完成、失败与链式传播。
- async/await 只是基于 Promise 的语法展开,底层仍遵循 thenable 吸收和微任务调度。
机制与流程
- Promise 一旦从 pending 进入 fulfilled 或 rejected 就不可逆;then/catch/finally 会派生出新的 Promise 链。
await会暂停当前 async 函数,把后续代码包装进微任务,等待目标 Promise 完成后继续。- 错误会沿 Promise 链冒泡,直到被 catch 或外层宿主处理。
关键差异
- Promise.all 适合“全成功才继续”,allSettled 适合收集全部结果,any 适合抢首个成功结果。
- 串行 await 可读性高但吞吐低;显式并发组织更适合批量请求。
边界条件
- Promise 不能取消,取消通常依赖 AbortController、业务标记或宿主 API 自身支持。
- 在循环里无脑 await 容易把本可并行的任务串行化。
工程落点
- 接口层设计要同时考虑错误传播、超时、取消与并发限制,而不只是“拿到返回值”。
- 复杂前端应用里的竞态问题,往往来自多个 Promise 链对同一状态的写入顺序不可控。