0

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

var promises = [], f=1;
while(f){
    suggested_id = new_random_id();
    promises.push(new Promise(function(resolve,reject) {
        red_client.sismember("uids", suggested_id, function(err, value) {
            if(err) {reject(err); }
            resolve(value);
        });
        setTimeout(resolve, 1000, 'foo');
    }));
    Promise.all(promises).then((values)=>{
        f = values[0];
    });
}
}

但是 Promises.all 又是另一个异步函数,因此循环开始对 redis 进行无数次调用,而无需等待前一个的响应。有谁知道如何做到这一点?

4

1 回答 1

1

你为什么不只是等待承诺成功完成然后运行你的工作

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。

于 2020-03-06T14:57:48.790 回答