解决承诺<待定>

时间:2017-10-07 20:52:03

标签: javascript async-await es6-promise

我希望创建一个简单的帮助函数,它使用bcrypt返回给定密码的哈希值,但每次调用该函数时,它都会解析为Promises { <pending> }我做错了什么?

const saltPassword = async (password) => {
    const newHash = await bcrypt.hash(password, saltRounds, (err, hash) => {
        if (err) return err;
        return hash;
    });
    return await newHash;
}

欢呼声

2 个答案:

答案 0 :(得分:2)

你应该做这样的事情

const saltPassword = async (password) => {
const newHash = await bcrypt.hash(password,      saltRounds, (err, hash) => {
    if (err) return err;
    return hash;
    });
return newHash; // no need to await here
}

// Usage

const pwd = await saltPassword;

答案 1 :(得分:0)

您需要返回Promise才能使用await。只需包装回调函数并在出现错误时调用reject,如果成功则解析。

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();

现在,您可以使用await等待承诺解析并使用该值。要捕获错误,请使用try / catch语句进行换行。

<强> 更新

Thomas指出,你可能不需要在一个promise中包含回调,因为如果你没有传递一个回调函数,bcrypt会返回一个promise。您可以将saltPasswordAsync上面的bycript.hash调用替换为const hash = await bcrypt.hash('bacon', 8); console.log('The hash is ', hash); ,如下所示:

routes/login.js