Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解决承诺<;待定>;_Javascript_Async Await_Es6 Promise - Fatal编程技术网

Javascript 解决承诺<;待定>;

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;

我希望创建一个简单的helper函数,它使用
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)