如何实现客户端生成4位ID并校验数据库存在性直至无冲突
实现方案
你需要的异步校验ID生成功能可以直接调整do...while的写法实现,JavaScript/TypeScript 原生不支持在do关键字前加await,但异步校验逻辑可以直接写在while的判断条件中,调整后的可运行代码如下:
const databaseIds = [1, 2, 3, 4, 5, 6, 7, 8] async function generateId(): Promise<number> { let myId: number; // 先执行ID生成,再异步校验是否已存在 do { myId = Math.floor(Math.random() * 11); } while (await checkIfIdExist(myId)); return myId } async function checkIfIdExist(id: number): Promise<boolean> { // 模拟数据库查询延迟 await new Promise(resolve => setTimeout(resolve, 2000)); return databaseIds.includes(id) }
优化建议
针对4位ID碰撞概率高的场景,可以做两点优化:
- 生成ID前先拉取全量已存在的4位ID缓存到本地,后续校验直接走本地内存判断,避免每次循环都发起异步请求降低生成效率
- 增加最大重试次数限制,避免4位ID全量被占用时函数进入死循环
// 增加重试限制的优化版示例 async function generateId(maxRetry = 100): Promise<number> { let myId: number; let retryCount = 0; // 提前拉取全量已存在ID缓存 const existIds = await getAllExistIds(); do { if(retryCount >= maxRetry) { throw new Error('ID生成重试次数超限,请稍后重试') } myId = Math.floor(Math.random() * 10000); // 4位ID范围是0~9999 retryCount++ } while (existIds.includes(myId)); return myId }
内容的提问来源于stack exchange,提问作者Ibrahim Ali
相关产品推荐
相关产品推荐

