簡體   English   中英

為什么鏈接承諾不起作用?

[英]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 如果你想使用thenbcrypt.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM