HarmonyOS 7 小艺动作确认:确认期间文件已变化,怎样防止误执行

HarmonyOS 7 小艺动作确认:确认期间文件已变化,怎样防止误执行
确认框显示的是文件第3版,但等待点击时文件被另一端改到了第4版。确认内容没变,执行对象却变了。参数快照只能防止本地修改,还需要在执行位置检查资源版本。
适配范围
Map同步检查和删除在这个单进程示例中没有await,因此中间不会让出执行权。远端实现必须用数据库事务或条件更新原子完成比较与删除,不能先GET再DELETE。身份和权限检查仍是必需的。
案例一
确认期间被其他端更新:当前版本4,确认请求版本3。必须返回冲突,并保留资源,重新读取后再次确认。
案例二
同一确认重复提交:第一次删除成功,第二次返回missing,不能把缺失对象当作另一个对象继续处理。
可以运行的实现
export function commitDelete(store, request) {
const current = store.get(request.id);
if (!current) return {ok:false, reason:'missing'};
if (current.version !== request.expectedVersion) return {ok:false, reason:'conflict'};
store.delete(request.id);
return {ok:true};
}
复现与断言
把实现与以下测试放进同一个example.mjs,执行node example.mjs。断言失败会报错,全部通过正常退出。这些断言已经在本地Node.js执行;它们不代表SDK编译、真机接口调用或性能实测已经通过。
import assert from 'node:assert/strict';
const store = new Map([['A',{version:4}]]);
assert.deepEqual(commitDelete(store,{id:'A',expectedVersion:3}),{ok:false,reason:'conflict'});
assert.equal(store.has('A'), true);
assert.deepEqual(commitDelete(store,{id:'A',expectedVersion:4}),{ok:true});
assert.deepEqual(commitDelete(store,{id:'A',expectedVersion:4}),{ok:false,reason:'missing'});
方案取舍
本地确认框和不可变参数都挡不住外部更新。乐观版本检查让并发冲突可见,适合低冲突操作;高冲突场景可用服务端锁,但锁超时和死锁管理更复杂。
接入时别漏掉这些边界
Map同步检查和删除在这个单进程示例中没有await,因此中间不会让出执行权。远端实现必须用数据库事务或条件更新原子完成比较与删除,不能先GET再DELETE。身份和权限检查仍是必需的。
复用时把输入获取与纯逻辑分开:界面、系统事件和服务请求负责取得真实输入,独立模块负责给出判断或保存状态。保留上述两个案例作为回归测试,并对失败原因记录最少必要日志,不记录文件内容、账号凭据或其它敏感数据。升级SDK后重新核对支持设备、接口版本与错误行为,而不是只改目标版本号。
官方资料
示例验证环境为Node.js,验证范围是应用侧逻辑。本文不将示例当作系统接口接入代码;具体接口的支持设备、最低版本和调用方式,以所用SDK对应的官方文档为准。
更多推荐
所有评论(0)