javascript - 编写 Promise 时的错误模式?

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

我想知道在编写自定义 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()内部,所以这种事情不会发生。我认为,如果该函数返回一个自定义 promise ,并且所有内容都位于其中,那么它就会完美地工作,而且确实如此,但我想知道这样的嵌套 promise 是否是一种糟糕的做法,总体而言是一个糟糕的想法。

我做的另一件事是通过使用回调来以更传统的方式处理它,如下所示:

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

我愿意接受哪种方式更好的建议,并且有点想坚持 promise ,因此非常感谢有关如何以最佳方式实现 promise 的想法。

最佳答案

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

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

关于javascript - 编写 Promise 时的错误模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771376/

相关文章:

javascript - 检查是否为 Vue.js 中的 prop 提供了值

javascript - 使用javascript递归函数删除姓氏后缀

node.js - npm 和 node 版本不兼容会产生错误

javascript - 我的基于浏览器的应用程序使 chrome 选项卡崩溃,我的扩展程序使 chrome 浏览器崩溃?如何?

javascript - 更改附加的每个文本

node.js - Jenkins 在 Azure 上部署 NodeJS 应用程序

node.js - Mongoose 具有正则表达式和限制的不同查询?

javascript - 箭头函数的这个值用作函数表达式或对象的方法

javascript - 等待永远不会解决,之后的下一行从未执行

javascript - 生成器完成后,以数组形式返回连续产生的值