【问题标题】:Bad patterns when writing promises?编写 promise 时的错误模式?
【发布时间】:2017-08-03 22:13:45
【问题描述】:

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

我有以下情况。

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() 必须返回一个包含哈希密码的承诺。 .genSalt() 返回一个承诺,.hash() 也是如此。我需要的是 generateHash() 来返回 .hash() 返回的承诺,但由于它在 .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)
            });
        });
    })

我对哪种方式更好的建议持开放态度,并且希望坚持承诺,因此非常感谢有关如何以最好的方式使用承诺来做到这一点的想法。

【问题讨论】:

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


    【解决方案1】:

    当您使用的方法已经返回一个 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));
    }
    

    【讨论】:

      【解决方案2】:

      为什么要将 Promise 嵌套到 Promise 中?

      你可以这样做

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

      【讨论】:

      • 啊,是的。我应该睡一会儿。我真的不知道这怎么不明显。谢谢大家!
      • 你对重构这个也有什么建议吗? :) registerUser(newUser){ return new Promise((resolve, reject) => { encryption.generateHash(newUser.password) .then((hash) => { newUser.password = hash return User.create(newUser).then(resolve).catch(reject) }) .catch((error) => { console.log(error) }) }) }
      • 没关系,修好了。直接上床睡觉。令人难以置信的是,睡眠不足对你的影响。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 2015-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      相关资源
      最近更新 更多