Slate TypeScript如何获取最新数据,实现每次生成最大数+1?
问题与解决方案
问题背景
对象和链接的修改需等待函数执行完成后,才会同步到Objects.search() API。这导致Objects.search()始终返回旧的对象、属性和链接数据,搜索、筛选、聚合等操作无法实时反映编辑(创建/删除/修改)结果。
具体场景
通过Objects.search()获取某字段的最大值,再生成新数值(最大值+1)时,仅第一次操作成功,后续获取的依旧是旧最大值,导致生成重复数值。
解决思路与代码示例
方案1:使用原子递增操作(推荐)
直接借助底层存储的原子操作实现“获取最大值+递增”的逻辑,从根源避免先查询后修改的竞态问题,同时确保拿到的是最新数据。
示例(MongoDB环境)
// 假设存在存储计数器的集合,文档结构:{ _id: 'targetCounter', currentValue: 初始值 } async function getNextNumber() { // 原子查询并递增,返回更新后的最新值 const updatedCounter = await Objects.findOneAndUpdate( { _id: 'targetCounter' }, { $inc: { currentValue: 1 } }, { new: true, upsert: true } // new: 返回更新后的文档;upsert: 不存在则自动创建 ); return updatedCounter.currentValue; }
示例(MySQL环境)
-- 原子插入或更新计数器,自动递增 INSERT INTO counters (counter_name, current_value) VALUES ('targetCounter', 1) ON DUPLICATE KEY UPDATE current_value = current_value + 1; -- 获取最新递增后的值 SELECT current_value FROM counters WHERE counter_name = 'targetCounter';
方案2:强制刷新搜索索引后查询
如果平台提供刷新搜索索引的API,可在修改数据后手动触发刷新,确保Objects.search()能获取最新数据。
async function generateNewNumber() { // 1. 完成数据修改操作(如新增/更新对象) await saveNewObject(); // 2. 强制刷新搜索索引(需平台支持该API) await Objects.refreshSearchIndex(); // 3. 重新搜索获取最新最大值 const latestResult = await Objects.search({ filter: { /* 你的筛选条件 */ }, sort: { targetField: 'desc' }, // 按目标字段降序排列 limit: 1 // 只取第一条(最大值) }); const maxNum = latestResult[0]?.targetField || 0; return maxNum + 1; }
方案3:事务包裹操作
将“查询最大值+生成新数据”的逻辑放在同一个事务中,确保事务内的查询能看到未提交的修改(需平台支持事务)。
async function generateNewNumberInTransaction() { await Objects.startTransaction(); try { // 1. 在事务内查询当前最大值 const searchResult = await Objects.search({ filter: { /* 筛选条件 */ }, sort: { targetField: 'desc' }, limit: 1 }); const maxNum = searchResult[0]?.targetField || 0; const newNum = maxNum + 1; // 2. 创建或更新带新数值的对象 await Objects.create({ targetField: newNum }); // 3. 提交事务 await Objects.commitTransaction(); return newNum; } catch (err) { // 回滚事务 await Objects.abortTransaction(); throw err; } }
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

