使用javascript和redis生成唯一的随机id

使用javascript和redis生成唯一的随机id,javascript,node.js,redis,node-redis,Javascript,Node.js,Redis,Node Redis,我想为每个用户生成一个随机id,并使用node.js将其保存在redis集中。我的第一种方法是生成一个随机id,然后使用redis SISMEMBER检查它的唯一性,如果它不是唯一的,则使用循环重复上面的任务。问题是节点redis是异步的,因此,我无法实现上述循环。我还考虑过使用如下承诺: var-promissions=[],f=1; while(f){ 建议的_id=新的_随机_id(); 承诺.推送(新承诺(功能)(解决、拒绝){ red_client.sismember(“uids”),

我想为每个用户生成一个随机id,并使用node.js将其保存在redis集中。我的第一种方法是生成一个随机id,然后使用redis SISMEMBER检查它的唯一性,如果它不是唯一的,则使用循环重复上面的任务。问题是节点redis是异步的,因此,我无法实现上述循环。我还考虑过使用如下承诺:

var-promissions=[],f=1;
while(f){
建议的_id=新的_随机_id();
承诺.推送(新承诺(功能)(解决、拒绝){
red_client.sismember(“uids”),建议的_id,函数(err,value){
如果(错误){拒绝(错误);}
决心(价值);
});
setTimeout(解析,1000,'foo');
}));
承诺。所有(承诺)。然后((值)=>{
f=数值[0];
});
}
}
但是,all是另一个异步函数,因此循环开始运行
无数次呼叫redis而不等待前一次的响应。有人知道如何做到这一点吗?

你为什么不等待承诺成功完成,然后开始工作呢

const getUniqueId = new Promise( (resolve, reject) => {
  const generateId = async () => {
    suggested_id = new_random_id();
    red_client.sismember("uids", suggested_id, function(err, value) {
        if(err) {
          // call generateId again, this is the retry
          generateId () 
          return
        }
        resolve(suggested_id);
    });
   })

   generateId()
})


const uniqueId = await getUniqueId()

注意:考虑到您检查了id,然后您将使用它,您有可能同时丢失id。

我建议使用UID生成器。不幸的是,id最多需要10个字符。问题是您只能在异步函数中使用wait,不幸的是,我的主函数不是一个不应该成为问题的函数(id应该发送回用户以响应她的请求)。去掉等待并使用getUniqueId()。然后(res=>{})。我不知道您对请求的响应是同步还是异步。如果需要同步,你就倒霉了,你唯一的改变就是生成一个随机id。