как переписать с обратным вызовом для обещанного результата - PullRequest
1 голос
/ 25 апреля 2019

Существует функция, которая генерирует строку и возвращает ее, если она находится в таблице User.

 function generateFortToken(len) {
       let rs; 

        rs = randomstring.generate(len);
        User.findOne({where: {fort_token: rs}})
                .then(result => {
                    console.log("hit is : ", result);
                    if (!result) //need to return rs. but HOW?
                })
                .catch(err => {
                    console.log("Error search for fort token : ", err.message);
            });        

}

Этот generateFortToken находится в модуле helper и вызывается из родительской функции следующим образом:

user.fort_token = helper.generateFortToken(20);

Этот код не работает, так как много онлайн-сообщений, указанных с findOne возвращает обещание.Но мне трудно переписать его с обратным вызовом, чтобы вернуть значение сгенерированного токена.

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Код, который вы создали, в порядке, но его можно улучшить.В частности, вы попали в шаблон Promise antipattern .Короче говоря, вы создаете новое обещание (await new Promise(next => User.findOne(...))), когда вы можете использовать обещание, возвращенное User.findOne напрямую:

async function generateFortToken(len) {
  for (let rs;; rs = randomstring.generate(len)) {
    try {
      if (await User.findOne({ where: { fort_token: rs }})) {
        return rs;
      }
    }
    catch (err) {
      console.log('Error search for fort token : ', err.message);
    }
  }
}
0 голосов
/ 25 апреля 2019

Решена проблема с кодом ниже:

generateFortToken : async function(len) {
    let rs, bs, lp = true; 
    while (lp) {
        rs = randomstring.generate(len);
        await new Promise(next => {
            User.findOne({where : {fort_token : rs}})
                       .then(result => {
                            if(!result) lp = false;
                            next();
                       })
                       .catch(err => {
                            console.log("Error search for fort token : ", err.message);
                            //next();
                       });
        });

   }
   return rs;
},

В родительской функции:

user.fort_token = await helper.generateFortToken(20);

Вдохновлен Fernando Carvajal ответом на сообщение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...