ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

跨窗口拖拽松手后重复导入:dropSessionId 与数据指纹如何保证幂等

跨窗口拖拽松手后重复导入:dropSessionId 与数据指纹如何保证幂等 跨窗口拖拽松手后重复导入dropSessionId 与数据指纹如何保证幂等用户把三张图片从文件管理器拖到应用松手后列表出现六条日志里同一批数据触发了两次处理。跨窗口和跨设备拖拽涉及来源端、系统数据通路和目标组件回调重入或用户在无反馈时再次拖动都可能发生。去重不能只比较文件名也不能永远禁止相同图片再次导入。验证边界本文依据华为开发者官网截至 2026-09-25 可访问的资料整理。文中的状态机、去重器和坐标计算已经在 Node.js 宿主环境执行断言当前本机仍是 API 24 SDK且没有连接 HDC 真机因此不把这些断言写成 API 26 编译或真机实测。涉及窗口、拖拽和跨设备能力的正式交付仍需在 API 26 SDK、模拟器或对应真机上补齐接口编译、交互录像与日志证据。重复执行从哪里来若每个回调都立即创建记录同一次 drop 的重复通知会重复写入若用内容 hash 永久去重用户合法地再次添加相同素材又会被错误阻止。还有一种半失败数据库已写入缩略图任务失败重试后再次写数据库。需要同时区分“同一拖拽会话”和“不同时间的相同内容”。幂等边界怎么定义dropSessionId 标识一次交互内容指纹标识一条数据。目标端建立 RECEIVED、VALIDATED、COMMITTED、FAILED 状态同一 session 的相同指纹只处理一次不同 session 可以按业务规则再次导入。数据库提交与异步派生任务分开派生任务以 recordId 幂等重试不再重复创建主记录。type DropPhaseRECEIVED|VALIDATED|COMMITTED|FAILED; interface DropKey { sessionId:string; fingerprint:string } export function keyOf(k:DropKey){ return k.sessionId|k.fingerprint; } export function shouldHandle(seen:Setstring,k:DropKey):boolean { const keykeyOf(k); if(seen.has(key)) return false; seen.add(key); return true; } export function fingerprint(type:string,size:number,name:string){ return [type,size,name].join(:); }案例一同一次松手触发两次目标回调两次回调携带相同 sessionId解析出的内容指纹也相同第二次在 RECEIVED 门禁就返回已有结果。界面复用第一次的进度不显示第二条占位记录。会话结束后保留短期结果覆盖迟到回调。案例二缩略图失败后用户点击重试主记录已经 COMMITTED重试只重新运行以 recordId 为键的缩略图任务不重新导入 UDMF 数据。若用户隔天再次拖入相同图片新的 sessionId 允许进入再由业务层决定提示重复内容还是创建副本。失败、重试与回滚观察项容易写错更可靠的处理去重范围文件名永久去重sessionId 限定一次交互数据身份只比较标题或路径类型、大小和内容摘要组成指纹失败重试整条导入从头再来按阶段重试派生任务用户反馈重复回调各显示一条复用同一进度与结果会话去重和业务重复检测必须分开。前者保证一次拖拽只执行一次后者决定不同操作导入相同内容时的产品策略。状态机让数据库提交与缩略图、上传等后续任务各自可恢复。可复用门禁一次拖拽有稳定 dropSessionId。同一 session 的相同指纹只处理一次。主记录提交与派生任务分阶段。迟到回调能返回已有结果。不同 session 的相同内容由业务规则决定。官方资料与适用范围统一拖拽跨设备连接 UIAbility 开发指南重复导入不是简单加一个 Set 就结束。给一次交互和一条数据分别建立身份才能既挡住重入又不误伤用户真正的第二次操作。
返回列表