Vue Router数据:取消、过期响应与版本提交
前置:Vue watch清理、Promise与fetch状态。TaskPage.vue、TaskList.vue及src/api.mjs见完整任务工作台,下文状态与序号均由这些组件维护。示例未执行;命令与现象均为读者未来自行验证的步骤和预期,不能视为运行记录。
Vue Router页面为什么同时需要取消和过期响应检查
Vue Router页面为什么同时需要取消和过期响应检查?AbortController取消当前fetch读取,节省网络和解析工作,但不能保证服务端停止,也无法撤回已经完成的Promise。generation给每次页面读取分配序号,响应、错误和finally都只在序号仍是当前时写状态;这样任务A的慢请求不会覆盖后来任务B。两层保护针对不同问题,不能仅在成功分支检查而让旧错误或loading改变新页面。
侦听器清理时递增generation并abort,卸载后旧结果同样失效。回调先清task/title/done/error,再启动读取,避免把旧任务显示在新地址下面。列表用controller引用与alive实现相同归属约束;创建完成后若已卸载,也不重新加载。示例写请求不取消,只有完成后的页面写入受序号约束。
Vue任务页面应该怎样区分加载空结果和错误
Vue任务页面应该怎样区分加载空结果和错误?loading表示当前读取尚未完成;空数组表示读取成功但无任务;error表示读取失败,三者不能都用“暂无数据”表达。详情task在切换时置null,404显示资源不存在或已删除,网络错误显示可重试消息,未知前端路径则由NotFound组件显示页面不存在。这些状态对应不同修复动作。
按钮根据loading/saving禁用,错误用role=alert,加载用role=status,文本通过插值显示,避免v-html渲染后端消息。列表先清旧结果,是本例明确选择;如果保留旧数据,应标记过期并禁止以旧版本误提交。重新加载按钮写明丢弃草稿,不把破坏编辑内容的动作伪装成无影响刷新。
Vue保存任务时应该发送哪个版本
Vue保存任务时应该发送哪个版本?发送读取任务时取得的字符串version,而不是本地计数器或当前时间。点击保存时冻结task快照并设置saving,重复点击立即返回;输入和按钮也禁用。成功后跳转详情重新读取;409显示版本冲突,使用者重读后再编辑。前端不自动把旧草稿换个新版本覆盖服务端。
每次写入也捕获generation,避免保存A期间切换B后,A完成又把用户导航回A。离开页面不保证服务端写入取消,网络超时可能已经提交;POST无幂等键,不能自动重试。删除同样带version查询参数,204没有JSON体,统一request必须先分支处理204再解析。
Vue请求封装为什么要检查HTTP状态
Vue请求封装为什么要检查HTTP状态?fetch遇到HTTP400/404/409通常仍履行Promise,只有网络等错误才拒绝,所以必须检查response.ok再解析成功数据。封装将错误状态和消息放入ApiError,页面按status区分404和409;若代理返回HTML或空响应,错误解析失败也要给通用消息,而不是再抛一个JSON解析异常覆盖原因。
request集中添加JSON请求头,路径只接受应用构造的任务后缀,不接受任意外部URL。读取传AbortSignal,写入发送JSON.stringify生成的请求体;id和version都经encodeURIComponent组成路径或查询。当前示例信任匹配契约的成功响应,不实现完整运行时schema验证;若接入不受控后端,必须补充响应校验与错误策略,不能把静态OpenAPI当作运行时验证器。
练习:慢读取与晚写入时间线
按时间顺序:A读取开始;切换B;B读取成功;A读取失败;B开始保存;离开到列表;B保存成功。逐项说明最终页面和允许发生的服务端变化。只调用abort而不检查generation是否足够?
参考答案(推演,未执行)
A的清理取消读取并递增序号,B成功可写入;A晚错误和finally序号过期,都不能影响B的错误/loading。离开列表后B保存可能在服务端提交,但完成后的导航因旧generation被挡住,页面仍在列表;列表数据需按读取结果判断,不能承诺离开会撤回写入。abort不保证已完成Promise或服务端操作停止,必须同时检查generation,且成功、失败与finally都要检查。
继续阅读
- 排错
- 开发实践
- 开发实践