bcrypt.compare() 是异步的,那是不是就一定会延迟呢?
bcrypt.compare() is asynchronous, does that necessarily mean that delays are certain to happen?
我正在使用 bcryptjs 包来散列和比较密码。
下面使用的 compareSync
方法是同步的,returns 是一个布尔值。它可靠且按预期工作。
let trueOrFalse = bcrypt.compareSync('abcd', '1234');
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
下一个示例使用异步 compare
方法。我担心因为这个版本是异步的,如果服务器上有任何延迟,它可能会在 bcrypt.compare
确定 res
的值之前到达 if/else
语句。这是一个合理的担忧,还是我误解了这种异步函数的性质?
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
中的回调函数之前完成。你总是会看到 'oops, it was false'.
您可以在主函数中等待真正的结果,然后在控制台中显示一些内容。
为了比较 'waitable' 你可以把它包装成 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 中,因为它会从 callback hell.
中保存应用程序
Node.js 运行时间肯定会 运行 在您从异步计算中获得结果之前的同步代码(if-else 语句)。保证计算仅在中回调函数完成:
bcrypt.compare('abcd', '1234', function(err, res) {
// make your checks here
if (res) {
// ...
}
})
我正在使用 bcryptjs 包来散列和比较密码。
下面使用的 compareSync
方法是同步的,returns 是一个布尔值。它可靠且按预期工作。
let trueOrFalse = bcrypt.compareSync('abcd', '1234');
if(trueOrFalse) {
console.log('hooray, it was true');
} else {
console.log('oops, it was false');
}
下一个示例使用异步 compare
方法。我担心因为这个版本是异步的,如果服务器上有任何延迟,它可能会在 bcrypt.compare
确定 res
的值之前到达 if/else
语句。这是一个合理的担忧,还是我误解了这种异步函数的性质?
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
中的回调函数之前完成。你总是会看到 'oops, it was false'.
您可以在主函数中等待真正的结果,然后在控制台中显示一些内容。
为了比较 'waitable' 你可以把它包装成 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 中,因为它会从 callback hell.
中保存应用程序Node.js 运行时间肯定会 运行 在您从异步计算中获得结果之前的同步代码(if-else 语句)。保证计算仅在中回调函数完成:
bcrypt.compare('abcd', '1234', function(err, res) {
// make your checks here
if (res) {
// ...
}
})