有一个函数可以生成一个字符串并返回它(如果它在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
返回了一个承诺,因此该代码无法像许多在线帖子所述的那样工作。但是我很难用回调重写它以返回生成的令牌的值。
答案 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。