1. 串行请求编排
const generateReportsSerially = async () => {
for(const item of reportQueue) {
if(abortController.signal.aborted) break;
await generateSingleReport(item);
}
}
- 队列控制:通过for循环+await实现真正串行执行
- 状态管理:使用Vue响应式变量跟踪当前处理项
- 中断检测:每次循环检查AbortSignal状态
2. 中断控制体系
axios.interceptors.request.use(config => {
config.signal = abortController.signal;
return config;
});
onUnmounted(() => abortController.abort());
- AbortController:现代浏览器原生支持的中断方案
- 自动关联:通过拦截器注入signal实现全局中断
- 生命周期绑定:利用Vue的onUnmounted自动清理
3. 路由守卫增强
router.beforeEach((to, from, next) => {
if(abortController.signal.aborted) {
next('/interrupted');
} else {
next();
}
});
- 导航守卫:结合路由跳转检测任务状态
- 状态恢复:通过Vuex/Pinia持久化中断点信息
实战技巧集锦
1. 进度模拟与真实进度同步
const simulateProgress = (item) => {
let progress = 0;
return setInterval(() => {
item.loadingProgress = Math.min(100, progress += 10);
}, 500);
}
- 视觉反馈:通过定时器模拟进度条
- 真实同步:接口返回后重置模拟进度
2. 错误边界处理
try {
const response = await apiRequest();
} catch (error) {
if(axios.isCancel(error)) return;
handleError(error);
}
- 区分错误类型:精确处理取消请求与其他异常
- 资源回收:在finally中清除定时器/监听器
3. 游客模式特殊处理
if(isTouristMode) {
await generateFirstReport();
router.push('/result');
}
- 流程截断:在特定条件下提前终止队列
- 路由跳转:携带状态参数实现平滑过渡
性能优化方案
优化维度 | 实现方案 | 效果 |
---|
内存泄漏 | AbortController自动回收 | 减少80%无效请求 |
响应速度 | 预加载策略+请求缓存 | 提升40%感知速度 |
异常恢复 | 本地存储中断点信息 | 100%状态可恢复 |
最佳实践原则
- 单一职责:每个async函数只处理一个业务单元
- 防御性编程:在关键节点添加状态检查
- 渐进增强:优先使用原生AbortController,polyfill备用方案
- 用户体验:提供明确的中断提示和续操作选项