如何解决await 函数没有等待异步匿名函数
我尝试使用 await 使我的异步函数像同步任务一样工作,它适用于常规函数。但这对我的匿名函数不起作用。
所以我的猫鼬模式中有这个功能:
userSchema.methods.comparePassword = function comparePassword(candidatePassword,cb) {
bcrypt.compare(candidatePassword,this.password,(err,isMatch) => {
cb(err,isMatch);
});
};
我尝试使用 bcrypt.compare
验证我的散列密码,这要求我使用匿名函数来获取结果。
所以我尝试使用这个函数比较密码:
async (email,password,h) => {
const user = await User.findOne({email: email,isDeleted: false})
if (!user) {
const data = ResponseMessage.error(400,User Not Found')
return h.response(data).code(400)
}
await user.comparePassword(password,isMatch) => {
if (isMatch) {
console.log('TRUE')
return h.response('TRUE')
} else if (!isMatch) {
console.log('FALSE')
return h.response('FALSE')
}
})
console.log('END OF FUNCTION')
return h.response('DEFAULT')
}
附件:
我尝试运行服务器并比较密码,但它给了我默认的结果。我尝试使用控制台进行调试,然后它显示 TRUE/FALSE 在 END OF FUNCTION 之后显示。所以它证明我的函数运行良好,但我的 await 函数没有等待我的任务运行另一行。
对我的这个有什么帮助吗?
解决方法
尝试将其分配给 Promise,如下所示:
userSchema.methods.comparePassword = async (candidatePassword,cb) => {
await new Promise ((resolve,reject)=>{
bcrypt.compare(candidatePassword,this.password,(err,isMatch) => {
resolve(cb(err,isMatch));
});
})
};
,
您已为比较函数提供了回调。 bcrypt docs 说
"接受回调的异步方法,回调时返回一个Promise 如果 Promise 支持可用,则未指定。”
Promise 支持可能是可用的,所以尽量不要返回回调,它看起来应该可以工作。 :-)
顺便说一下,如果您遇到不支持 Promise 的后续 API,您可能需要查看 Node 的 util.promisify 函数。它将它们转换为基于 Promise 的函数。来自链接的文档:
const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
const stats = await stat('.');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。