如何实现函数对相同matchID参数仅执行一次,忽略其他入参
相同matchID仅单次执行的实现方案
你需要为函数调用增加ID去重逻辑,确保同一个matchID仅首次调用时执行原有逻辑,后续重复调用直接跳过。
实现步骤
首先在模块顶层声明一个内存缓存集合,用来存储已经执行过的matchID:const executedMatchIds = new Set()
方案1:封装原函数(无侵入调用)
直接对原有函数做一层封装,调用时直接用封装后的函数即可,不需要修改其他调用逻辑:
const executedMatchIds = new Set(); async function dedupeInsertingMatchIds(fieldersA, matchID) { if (executedMatchIds.has(matchID)) return; executedMatchIds.add(matchID); // 调用原有函数逻辑 await insertingMatchIdsInAllTeamPlayers(fieldersA, matchID); } // 调用示例 await dedupeInsertingMatchIds(fieldersA, matchID);
方案2:调用侧直接加判断
如果不想额外封装函数,直接在原调用位置增加判断逻辑即可:
const executedMatchIds = new Set(); // 原有调用位置修改为以下逻辑 if (!executedMatchIds.has(matchID)) { executedMatchIds.add(matchID); await insertingMatchIdsInAllTeamPlayers(fieldersA, matchID); }
特殊场景适配
- 若需要服务重启后仍能识别已执行的ID,将内存缓存
Set替换为数据库、Redis等持久化存储,每次调用前先查询持久化存储判断ID是否存在。 - 若为多实例部署场景,需使用Redis等分布式存储做ID去重,避免不同实例重复执行相同ID的逻辑。
内容的提问来源于stack exchange,提问作者Muhammad Danyal
相关产品推荐
相关产品推荐

