Fetch 不保证并发请求的执行顺序,但可通过 Promise 组合控制响应处理顺序:Promise.all() 按发起顺序返回结果;Promise.allSettled() 保持顺序并容错;Promise.race() 不保序;串行用 for...of + await。

Fetch 本身不保证并发请求的执行顺序,但你可以通过 Promise 的组合方式控制响应处理的顺序。关键在于区分“发送顺序”和“完成顺序”——多个 fetch 同时发出是并行的,谁先返回谁先 resolve,但你完全可以按发起顺序来处理结果。
用 Promise.all() 保持发起顺序
如果你需要所有请求都完成后再统一按原始顺序处理结果,Promise.all() 是最直接的方式。它会等待全部请求结束,并按数组索引顺序返回结果,与网络响应快慢无关。
- 每个 fetch 调用按需构造,放入数组(顺序即你期望的处理顺序)
- Promise.all 返回的数组下标严格对应原数组位置
- 即使第 0 个请求最慢,它的结果仍放在返回数组的第 0 位
示例:
const urls = ['/api/a', '/api/b', '/api/c'];const promises = urls.map(url => fetch(url).then(r => r.json()));
const results = await Promise.all(promises); // results[0] 对应 urls[0] 的响应
用 Promise.allSettled() 处理部分失败场景
当某些请求可能失败但仍希望保留其他成功结果的顺序时,Promise.allSettled() 更健壮。它同样保持输入顺序,每个元素是 { status, value | reason } 对象。
立即学习“Java免费学习笔记(深入)”;
- 不会因某个 fetch 拒绝而中断整个流程
- 结果数组长度和顺序始终与原始请求数组一致
- 适合容错要求高、需逐个检查状态的场景
避免用 Promise.race() 控制顺序
Promise.race() 返回第一个 settle 的结果,完全打乱顺序预期,不适合保序需求。它适用于超时控制或“取最快响应”,而非顺序保障。
- 哪怕你按顺序发起三个 fetch,race 返回的一定是响应最快的那一个
- 无法知道它对应原始数组中的第几个请求
- 如需超时+保序,应在每个 fetch 内部封装 timeout,再用 all 或 allSettled
需要逐个按序执行?用 for...of + await
如果业务逻辑强制要求“前一个完成后再发下一个”,就不要并发,改用串行。用 for...of 循环配合 await 最清晰直观。
- 天然保持发起和处理的严格顺序
- 便于错误处理(try/catch 可捕获单个请求失败)
- 注意性能代价:总耗时 ≈ 所有请求耗时之和
示例:
const urls = ['/api/a', '/api/b', '/api/c'];const results = [];
for (const url of urls) {
const res = await fetch(url).then(r => r.json());
results.push(res);
}


















