先核对最后一次选择的身份
使用 Flux Art 图片搭建自己的素材选择器时,先选甲再选乙,最后看到的却仍是甲,不一定是上传失败。读取、解码与界面提交是不同阶段,先启动的任务可能后完成。本文只讨论自建工具中的预览结果归属,不评价生成图片的质量,也不宣称平台存在此故障。验收目标是缩略图、文件名、当前素材编号和导出来源一起指向用户最后接受的版本,而不是仅看画面有没有出现。
把选择与完成分别记下来
建议为每次有效选择分配递增序号,记录本次文件身份、开始时刻、完成状态以及最终是否获准提交。文件名可能相同,不能独自承担版本标识。先让日志区分“已选乙”“甲已解码”“甲被丢弃”“乙已提交”,才能看清乱序。日志不应包含整张图片或用户本地完整路径。若只能看到一条统一的完成提示,就无法判断是哪一次选择完成,更不能据此宣布修复。
等待解码不等于获得界面写入权
HTMLImageElement.decode 返回的 Promise 可用于等待图片解码完成后再显示;请求失败、数据问题或解码过程中来源变化可能导致拒绝。它解决图片准备状态,不替应用决定结果是否仍属于当前选择。建议每次任务使用独立候选图片和捕获的选择序号,在异步步骤结束后重新比较当前序号,再决定是否更新界面。下表区分这些阶段,避免把完成顺序当作用户意图顺序。
| 发生顺序 | 应该提交什么 | 需要留下什么 |
|---|---|---|
| 甲开始乙后开始 | 暂不由顺序猜结果 | 两次选择序号 |
| 乙先完成 | 乙仍为当前才提交 | 乙提交记录 |
| 甲后完成 | 丢弃过期甲 | 甲丢弃原因 |
| 过期任务失败 | 不覆盖当前成功 | 错误所属序号 |
| 当前任务失败 | 标明未接管 | 可恢复的旧状态 |
| 关闭后任务结束 | 不写入已关界面 | 关闭与清理记录 |
只有当前任务可以一次性交接显示
若序号仍匹配,将图片、名称、素材编号和导出引用作为同一次提交更新;若已经过时,只清理该候选占用的资源,不再改动当前状态。不要先把文件名改成乙、随后让甲的图片回调覆盖画面。为了显示加载状态,可以单独标明乙正在准备,同时继续展示已确认的甲,并明确它不是新选择的完成结果。是否保留旧预览是产品选择,前提是标签与操作不能误导。
失败提示同样需要归属核对
甲的失败如果晚于乙成功到达,不应把乙界面变成错误页。错误回调也需要比较任务身份,过期错误只能进入诊断记录。当前乙失败时,应清楚标记乙尚未接管,不把旧图当作乙保存。取消与换图并不一定中断底层解码,因此即使增加取消机制,也仍需提交前核对;忽略过期结果和终止计算是两件事,不能只做后者便删除前者。
设计可重复的乱序例子
假设测试工具人为让甲的准备过程延后,乙先完成,再允许甲结束。这是假设测试,不是真实平台测速。预期最终仍是乙,导出的文件也来自乙。随后测试甲成功乙失败、甲失败乙成功,以及连续选择同名不同内容三次。保存每次开始、完成、提交或丢弃的顺序。只在正常网速下连续点击几次,未必触发竞争条件,不能用“暂未看到”替代可控制的乱序验收。
资源清理不能误伤新任务
过期候选可能持有自己的对象 URL、图片对象或其他临时资源。清理动作必须带上该候选身份,不能读取一个后来被新任务覆盖的全局变量后直接释放。共享资源应另有明确的所有权管理。关闭面板时先让当前选择失效,再安排候选退出,防止卸载后的回调重新写入界面。已经提交的当前图仍需供用户操作,不能因为另一个任务过期而一起回收。
用导出结果完成最后核对
建议验收记录同时截取当前选择编号、可见预览和导出文件的内容摘要,必要时比较独立计算的文件哈希。若工具会重新编码图片,不能要求导出字节必然等于原图,应比较已声明的导出版本并检查内容。尚未完成的编码任务也需绑定选择身份。某一浏览器未覆盖的关闭或快速切换行为,应标为未知并保留限制说明,不用前端显示正确推断所有后续业务记录也正确。
资料与接入边界
技术依据核对于2026年11月9日:图片解码接口见 https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/decode 。选择序号和原子式界面交接是本文的工程建议,不是该接口自动提供的能力。Flux Art 生成结果可用于商业用途,第三方输入权利与商品真实性要另行核验。图片取得后的业务接入可参考 https://flux-art.net/zh/openapi ;自建预览器的并发状态应单独测试,不将本例当成平台上传或生成速度的实测。