关键不是避免创建promise,而是避免在循环中串行await promise;应改用promise.all()并发执行,根据容错需求选择all或allsettled,并避免在promise构造函数中使用async或无效return。

关键不是“别创建 Promise”,而是“别在循环里 串行创建并等待 Promise”。真正拖慢性能的,是用 await 把本可并发的任务硬生生变成排队执行。
用 Promise.all() 批量发起请求
当你要对一组 ID、URL 或配置项分别发起独立请求时,直接在 for 循环里 await 每个请求,等于让它们一个接一个跑——网络空闲、CPU 等待,效率极低。
- ✅ 正确做法:先收集所有 Promise,再统一 await
- ❌ 错误写法:
for (const id of ids) { const res = await fetch(`/api/user/${id}`); } - ✅ 推荐写法:
const promises = ids.map(id => fetch(`/api/user/${id}`)); const results = await Promise.all(promises);
根据失败容忍度选 all 还是 allSettled
两者都并发执行,区别在于错误处理策略:
-
Promise.all():任一失败,整个 Promise 立即 reject,适合强依赖场景(比如必须全部成功才能提交表单) -
Promise.allSettled():等所有 Promise 结束,返回每个结果的状态对象,适合聚合统计、容错上报等场景 - 注意:不要为了“保险”默认用
allSettled,如果业务逻辑真需要全成功,用all反而更清晰、更早暴露问题
避免在 Promise 构造函数里塞 async 函数
这种写法看似方便,实则埋雷:
- async 函数内部抛出异常,外部 new Promise 不会自动 reject,错误静默丢失
- Promise 构造器本身已提供 resolve/reject 控制流,再套一层 async 属于冗余封装
- ✅ 正确:
new Promise((resolve, reject) => { doSomething().then(resolve).catch(reject); }) - ❌ 避免:
new Promise(async (resolve, reject) => { await doSomething(); resolve(); })
别在循环中 return 值给 Promise 构造器
Promise 构造函数里的 return 语句完全无效,既不改变状态,也不传递值,纯属干扰阅读:
- Promise 的状态只能由
resolve()或reject()显式触发 - 构造器内任何 return 都被忽略,包括 return 一个 Promise 或普通值
- 正确做法:把要传递的数据明确传给
resolve(data)或reject(new Error(...))











