генерация уникального случайного идентификатора с использованием javascript и redis - PullRequest
0 голосов
/ 06 марта 2020

Я хочу сгенерировать случайный идентификатор для каждого пользователя и сохранить его в наборе перерисовок, используя node.js. Мой первый подход состоял в том, чтобы сгенерировать случайный идентификатор, а затем проверить его уникальность, используя redis SISMEMBER, и, если он не был уникальным, повторить задачу выше, используя al oop. Проблема в том, что redis узла является асинхронным, поэтому я не могу реализовать l oop, описанный выше. Я также подумал об использовании обещаний, как показано ниже:

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 - еще одна асинхронная функция, поэтому l oop начинает делать бесчисленные вызовы redis, не ожидая ответа от предыдущего. У кого-нибудь есть идеи, как это можно сделать?

1 Ответ

1 голос
/ 06 марта 2020

Почему вы просто не дожидаетесь обещания завершить sh с успехом и затем выполнить свою работу

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()

Примечание: учитывая тот факт, что вы проверяете идентификатор, а затем вы Если вы воспользуетесь ею, вы рискуете потерять идентификатор.

...