如何用回调重写承诺的结果

时间:2019-04-25 06:23:15

标签: javascript asynchronous callback

有一个函数可以生成一个字符串并返回它(如果它在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 个答案:

答案 0 :(得分:1)

您提供的代码很好,但是可以改进。特别是,您陷入了Promise constructor 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);
    }
  }
}

答案 1 :(得分:0)

解决了以下代码的问题:

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的启发,回复the post