您需要才能使用await
返回的承諾。只需包裝回調函數,並在出現錯誤時調用拒絕函數,或者在成功時解析。現在
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語句進行包裝。
UPDATE
托馬斯指出,你可能不需要包裹回調的承諾,因爲bcrypt返回一個承諾,如果你不傳遞一個回調函數。你可以像這樣用bycript.hash
調用替換到saltPasswordAsync
以上:
const hash = await bcrypt.hash('bacon', 8);
console.log('The hash is ', hash);
'saltPassword'是一個承諾,所以你需要使用'then'它來通過回調獲得價值。這就是異步代碼的工作原理。您不能期望得到函數返回值,該值只有在函數已經返回時纔會到達。注意:第二個「await」是無用的。 – trincot
從'return'語句中刪除'await'。 –
'async'函數總是返回promise。所以你需要從異步函數中調用'saltPassword'並等待它,或者學習如何使用promise。 – JLRishe