表单多步骤提交需用promise队列串行化ajax请求以保障顺序执行。通过维护queue = promise.resolve()并链式追加.then(() => requestfn()),实现步骤严格串行;支持abortcontroller软取消、按钮防重、加载状态与错误分级处理,纯原生fetch即可实现。

在表单多步骤提交中,Ajax 请求必须严格按顺序执行(比如:先验证手机号 → 再发送验证码 → 再提交完整表单),否则后端校验会失败或状态错乱。单纯用 async/await 链式调用还不够——因为用户可能快速点击多次、网络异常重试、或某步请求被取消。真正可靠的顺序保障,靠的是「请求队列」机制。
用 Promise 队列串行化请求
核心思路:不直接发起请求,而是把每个请求包装成一个返回 Promise 的函数,推入队列;队列逐个执行,前一个 resolve 后才触发下一个。
- 维护一个
queue = Promise.resolve()作为执行链起点 - 每次新增步骤时,用
.then(() => requestFn())追加到链尾 - 所有步骤都共享同一队列,天然避免并发冲突
示例:
let queue = Promise.resolve();
function addToQueue(requestFn) {
queue = queue.then(() => requestFn()).catch(err => {
console.error('队列中某步失败', err);
throw err; // 不吞错误,便于上层处理
});
return queue;
}
// 步骤1:校验手机号
addToQueue(() => fetch('/api/check-phone', { method: 'POST', body: JSON.stringify({ phone }) }));
// 步骤2:发送验证码(自动等步骤1完成)
addToQueue(() => fetch('/api/send-code', { method: 'POST', body: JSON.stringify({ phone }) }));
// 步骤3:提交表单
addToQueue(() => fetch('/api/submit', { method: 'POST', body: JSON.stringify(formData) }));
支持取消与防重复提交
用户点快了、切页了、或某步超时,需安全中断队列。不能粗暴 abort 所有请求(可能已部分成功),而应让队列“软停止”:
- 给每个请求函数加
signal参数,配合AbortController - 队列执行中检测是否已被取消,跳过后续步骤但保留当前进行中的请求
- 按钮点击后立即禁用,并清空旧队列(重新初始化
queue = Promise.resolve())
关键点:取消只影响未开始的步骤,正在运行的请求仍需完成,避免数据残留或状态不一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
结合加载状态与错误恢复
纯队列不等于用户体验好。需同步管理 UI 状态:
- 每步开始前设置当前步骤 loading = true,成功后设为 false
- 某步失败时,提供明确提示(如“短信发送失败,请重试”),并允许用户单独重试该步(不重放整个队列)
- 后端返回 400 类错误时,应解析具体字段错误(如 phone_used),更新对应表单项,而非全局报错
这样既保顺序,又不牺牲交互灵活性。
不用第三方库也能轻量实现
不需要引入 axios 或 redux-saga。原生 fetch + Promise 就够用。重点不是技术多炫,而是:
- 所有异步操作统一走队列入口
- 每步职责单一(只做一件事,不嵌套请求)
- 错误边界清晰(每个步骤 catch 自己的错误,不污染队列)
复杂场景可封装成 Hook(如 useStepQueue),但底层逻辑不变。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










