高性能javascript异步代码靠合理调度、减少等待、避免阻塞和精准控资源;应并发发起无依赖请求,用promise.all()压缩耗时,配合allsettled、超时控制、节流分组及竞速策略提升健壮性。

高性能的 JavaScript 异步代码不靠单次请求变快,而靠合理调度、减少等待、避免阻塞和精准控制资源。核心是让 CPU 和网络不空转、不堆积、不浪费。
并行执行独立任务
多个无依赖的异步操作(如获取用户信息、商品列表、配置项)应并发发起,而非逐个 await。串行写法会让总耗时等于各请求时间之和;用 Promise.all() 可压缩到最慢那个请求的耗时。
- ✅ 推荐:
const [user, products, config] = await Promise.all([fetchUser(), fetchProducts(), fetchConfig()]); - ⚠️ 注意:若任一失败,
Promise.all()整体 reject;需要“尽力完成”,改用Promise.allSettled()或包装成忽略错误的 Promise
提前启动非依赖操作
不是所有逻辑都必须等上一个 await 结束。UI 状态更新、日志上报、埋点触发、缓存预加载等,只要不依赖前序结果,就该立即执行,不卡在 await 后面。
- 先发请求再设 loading:
const dataPromise = api.getData(); setLoading(true); const data = await dataPromise; - 副作用分离:
await loadProfile(); sendAnalytics('profile_loaded'); // 不需等埋点返回 - 非关键操作可 fire-and-forget:
localStorage.setItem('lastVisit', Date.now()); // 不 await,也不 catch
控制并发数量与超时机制
一次性发起几十个 fetch 会超出浏览器连接池限制(通常 6~10 个同域并发),导致排队、延迟甚至失败。同时,没有超时的请求可能无限挂起。
- 对批量请求做节流或分组:
const chunked = chunk(urls, 5); const results = []; for (const chunk of chunked) { results.push(...await Promise.all(chunk.map(fetch))); } - 为 fetch 封装超时:
Promise.race([fetch(url), new Promise((_, r) => setTimeout(() => r(new Error('timeout')), 8000))])
善用工具函数提升健壮性
原生 Promise 提供了多种组合策略,配合恰当能显著提升容错与响应速度。
-
Promise.race():适用于多源竞速,比如“缓存 + API”中取最快返回的结果 -
Promise.any():至少一个成功即 resolve,适合冗余数据源场景 - 拒绝时始终传 Error 实例:
reject(new Error('network failed')),便于堆栈追踪 - 避免在循环中 await:
for (const id of ids) await fetchItem(id)是性能陷阱;改用Promise.all(ids.map(fetchItem))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











