Javascript 解决承诺<;待定>;
我希望创建一个简单的helper函数,它使用Javascript 解决承诺<;待定>;,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,我希望创建一个简单的helper函数,它使用bcrypt返回给定密码的哈希值,但每次调用该函数时,它都会解析为Promises{}我做错了什么 const saltPassword = async (password) => { const newHash = await bcrypt.hash(password, saltRounds, (err, hash) => { if (err) return err; return hash;
bcrypt
返回给定密码的哈希值,但每次调用该函数时,它都会解析为Promises{}
我做错了什么
const saltPassword = async (password) => {
const newHash = await bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) return err;
return hash;
});
return await newHash;
}
干杯为了使用
等待
,您需要回复承诺。如果出现错误,只需包装回调函数并调用reject;如果成功,则调用resolve
const saltPasswordAsync = (password, rounds) =>
new Promise((resolve, reject) => {
bcrypt.hash(password, rounds, (err, hash) => {
if (err) reject(err);
else resolve(hash)
});
});
async function doStuff() {
try {
const hash = await saltPasswordAsync('bacon', 8);
console.log('The hash is ', hash);
} catch (err) {
console.error('There was an error ', err);
}
}
doStuff();
现在,您可以使用wait
等待承诺来解析和使用该值。要捕获错误,请使用try/catch语句包装
更新
Thomas指出,您可能不需要将回调封装在承诺中,因为如果不传递回调函数,bcrypt将返回一个承诺。您可以将上面对saltPasswordAsync
的调用替换为byscript.hash
,如下所示:
const hash = await bcrypt.hash('bacon', 8);
console.log('The hash is ', hash);
您需要返回承诺才能使用
wait
。如果出现错误,只需包装回调函数并调用reject;如果成功,则调用resolve
const saltPasswordAsync = (password, rounds) =>
new Promise((resolve, reject) => {
bcrypt.hash(password, rounds, (err, hash) => {
if (err) reject(err);
else resolve(hash)
});
});
async function doStuff() {
try {
const hash = await saltPasswordAsync('bacon', 8);
console.log('The hash is ', hash);
} catch (err) {
console.error('There was an error ', err);
}
}
doStuff();
现在,您可以使用wait
等待承诺来解析和使用该值。要捕获错误,请使用try/catch语句包装
更新
Thomas指出,您可能不需要将回调封装在承诺中,因为如果不传递回调函数,bcrypt将返回一个承诺。您可以将上面对saltPasswordAsync
的调用替换为byscript.hash
,如下所示:
const hash = await bcrypt.hash('bacon', 8);
console.log('The hash is ', hash);
你应该这样做
const saltPassword=async(密码)=>{
const newHash=wait bcrypt.hash(密码,salthards,(err,hash)=>{
if(err)返回err;
返回散列;
});
return newHash;//无需在此等待
}
//用法
const pwd=等待密码;
您应该这样做
const saltPassword=async(密码)=>{
const newHash=wait bcrypt.hash(密码,salthards,(err,hash)=>{
if(err)返回err;
返回散列;
});
return newHash;//无需在此等待
}
//用法
const pwd=等待密码;
saltPassword
是一个承诺,因此您需要在其上使用然后使用通过回调获取值。这就是异步代码的工作方式。您不能期望得到一个函数返回值,该值只在函数已经返回时才到达。注意:第二个await
无效。请从return
语句中删除await
。async
函数始终返回承诺。因此,您需要从异步函数调用saltPassword
并等待它,或者学习如何使用承诺。@在这种情况下,两个wait
s都是无用的,因为OP除了返回它之外,没有对newHash
执行任何操作。您可以将整个函数缩短为const saltPassword=async(password)=>bcrypt.hash(密码,salthards)
但这不会改变此任务的异步性质,而且您必须处理承诺saltPassword
是一个承诺,因此您需要在其上使用然后
通过回调获取值。这就是异步代码的工作方式。您不能期望得到一个函数返回值,该值只在函数已经返回时才到达。注意:第二个await
无效。请从return
语句中删除await
。async
函数始终返回承诺。因此,您需要从异步函数调用saltPassword
并等待它,或者学习如何使用承诺。@在这种情况下,两个wait
s都是无用的,因为OP除了返回它之外,没有对newHash
执行任何操作。您可以将整个函数缩短为const saltPassword=async(password)=>bcrypt.hash(密码,salthards)但这并不会改变此任务的异步性质,也不会改变您必须处理的问题promise@Thomas谢谢我更新了我的答案。我从未使用过bcrypt,OP也没有提到他们使用的是哪个实现,所以我将保留这两个选项。@Thomas谢谢!我更新了我的答案。我从来没有使用过bcrypt,OP也没有提到他们使用的是哪个实现,所以我将保留这两个选项。