javascript - bcrypt.compare() 是异步的,这是否一定意味着肯定会发生延迟?
问题描述
我正在使用bcryptjs包来散列和比较密码。
下面compareSync
使用的方法是同步的并返回一个布尔值。它可靠并且按预期工作。
let trueOrFalse = bcrypt.compareSync('abcd', '1234');
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
下一个示例使用异步compare
方法。我担心因为这个版本是异步的,如果服务器上有任何延迟,它可能会if/else
在bcrypt.compare
确定res
. 这是一个有效的问题还是我误解了这种异步函数的性质?
let trueOrFalse;
bcrypt.compare('abcd', '1234', function(err, res) {
trueOrFalse = res;
}
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
解决方案
异步方法会和你的主程序并行执行,所以你console.log
会在里面的回调函数之前完成bcrypt.compare
。您将始终看到“哎呀,这是错误的”。
您可以在 main 函数中等待真正的结果,然后在控制台中显示一些内容。
要使比较“等待”,您可以将其包装成Promise
:
function compareAsync(param1, param2) {
return new Promise(function(resolve, reject) {
bcrypt.compare(param1, param2, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
}
const res = await compareAsync(param1, param2);
console.log(res);
我更喜欢将遗留回调函数包装到 Promises 中,因为它会将应用程序从回调地狱中拯救出来。
推荐阅读
- python-3.x - 刷新 tkinter 消息框中的文本
- postgresql - Postgres 表分区没有提高查询速度
- java - iText PdfCopy 创建可编辑的 pdf 文档
- javascript - var fs = require('fs') 之后的代码没有运行
- css - 颜色的过渡是即时的?
- c++ - blobdetector 中的 opencv 3 C++ 功能规范中的错误?
- jquery - 使用 Jquery 发布图片
- python - 在 Python 列表理解中更新 JSON 元素
- python-3.x - 在 python 中解析嵌套的 List 列表和字典
- regex - 使用 sed 匹配同一行中的多个模式