写承诺时的不良模式?

时间:2017-03-13 18:57:29

标签: javascript node.js ecmascript-6 es6-promise

我想知道在撰写自定义承诺时我是否使用了不良做法。

我有以下情况。

generateHash(password){
    return new Promise((resolve, reject) => {
        bcrypt.genSalt(10).then(salt => {
            bcrypt.hash(password, salt).then(hash => {
                resolve(hash)
            }).catch(reject)
        }).catch(reject)
    })
}

generateHash()必须返回包含散列密码的promise。 .genSalt()返回一个promise,而.hash()也是如此。我需要的是generateHash()来返回.hash()返回的promise。但是因为它在.genSalt()里面这样的事情并没有发生。我认为如果函数返回一个自定义的承诺并且所有内容都位于其中它将完美地工作并且确实如此,但是我想知道嵌套这样的承诺是否是一种糟糕的做法和一个糟糕的想法。

我做的另一件事是通过使用类似的回调来接近传统方式:

return new Promise((resolve, reject) => {
        bcrypt.genSalt(10, function (err, salt) {
            bcrypt.hash(password, salt, function (err, hash) {
                if (err) return reject(err)
                resolve(hash)
            });
        });
    })

我倾向于建议哪种方式更好,并且希望坚持承诺,因此非常感谢有关如何以最好的方式实现承诺的想法。

2 个答案:

答案 0 :(得分:1)

当您使用的方法已经返回承诺时,无需创建自己的承诺。以下代码将生成的哈希记录到控制台,而不是自己创建承诺:

const bcrypt = require("bcrypt")
function generateHash(password){
    return bcrypt.genSalt(10).then(salt => {
            return bcrypt.hash(password, salt).then(hash => {
                return hash;
            })
        })
}

generateHash("foo").then(v => console.log(v));

请注意,您需要返回内部函数 - 所以基本上,代码将归结为

function generateHash(password){
    return bcrypt.genSalt(10).then(salt => bcrypt.hash(password, salt));
}

答案 1 :(得分:1)

为什么要将承诺嵌入承诺?

你可以做到

generateHash(password){
    return bcrypt.genSalt(10)
                 .then(salt => bcrypt.hash(password, salt) )
}