[英]why chaining the promise doesn't work?
我不明白為什么這個代碼塊會拋出錯誤:
無法讀取未定義的屬性'then'
bcrypt.genSalt(10,(err, salt) =>{
if(err){
console.log(err);
}
return bcrypt.hash(password,salt);
}).then((hash)=>console.log(hash));
當這成功記錄哈希時
bcrypt.genSalt(10,(err, salt) =>{
if(err){
console.log(err);
}
bcrypt.hash(password,salt).then((hash) => console.log(hash));
});
因為bcrypt.hash
返回 - Promise<string>
不應該這兩個代碼塊都應該工作(日志哈希)?
謝謝 !
genSalt
函數不返回promise(編輯:當省略回調時它會執行)。 相反,它需要一個回調,無論你從該回調函數返回什么,都與genSalt
的返回完全分開。 也就是說,無論你的回調函數返回什么, genSalt
返回undefined。
所以為了使這個工作,你可以將genSalt
函數包裝成一個這樣的承諾:
function genSaltPromise(num) {
return new Promise((resolve, reject) => {
bcrypt.genSalt(num, (err, salt) => {
if (err) return reject(err);
resolve(salt);
})
})
}
然后你就可以像這樣使用它:
genSaltPromise(10).then(salt => {
return bcrypt.hash(password, salt);
}).then(hash => {
console.log(hash);
});
編輯:正如@Bergi所指出的,當沒有指定回調時, genSalt
會返回一個承諾。 所以上面的內容可以簡化為:
bcrypt.genSalt(10).then(salt => {
return bcrypt.hash(password, salt);
}).then(hash => {
console.log(hash);
});
來自文檔 :
接受回調的異步方法,如果Promise支持可用,則在未指定回調時返回Promise。
所以只要省略回調和使用then
改為 :
bcrypt.genSalt(10).then(salt => {
return bcrypt.hash(password,salt);
}).then(hash => {
console.log(hash);
}, err => {
console.log(err);
});
因為第一片段失敗.then(..)
被調用中的返回值genSalt(..)
; 基於錯誤消息,我會說該方法不返回任何內容。
第二個代碼段是有效的,因為你正在調用bcrypt
,這是一個承諾。
Promise由回調函數返回,而不是bcrypt.genSalt
。 因此,如果使用回調函數鏈接, then
它將起作用,而不是bcrypt.genSalt
。 如果你想使用then
用bcrypt.genSalt
,你需要用它的承諾。 例如: -
new Promise((resolve, reject) => {
bcrypt.genSalt(10,(err, salt) =>{
if(err){
console.log(err);
}
resolve(bcrypt.hash(password,salt));
})
}).then((hash)=>console.log(hash));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.