【问题标题】:Callback function parameters [duplicate]回调函数参数 [重复]
【发布时间】:2017-08-06 18:44:11
【问题描述】:

我一直在关注 Node.js 教程。我一直怀疑数据是如何传递给回调函数参数的。举个例子

User.addUser(newUser, (err, user) =>{
    if(err){
        res.json({success: false, msg:'Failed to register new user'});
    } else {
        res.json({success: true, msg:'User registered'});
    }
});

addUser 函数定义为,

module.exports.addUser = function(newUser, callback){
    bcrypt.genSalt(10, (err,salt)=>{
        bcrypt.hash(newUser.password, salt, (err, hash) => {
            if(err) throw err;
            newUser.password = hash;
            newUser.save(callback);
        });
    });
}

我不明白 err 和 user 是如何传递的。有人可以解释一下吗?

【问题讨论】:

  • 他们不是从这里传过来的。它们是从newUser.save 内部传递的。您只是将 callback 传递给该函数,该函数可能最终会调用它。
  • 快速看这里return a value from closure to main method,它是用于php的,但我认为它是相同的逻辑

标签: javascript node.js


【解决方案1】:

答案是newUser.save 也接受callback 参数并传递相同类型的参数。所以你可以直接将回调传递给保存。我想user.save 看起来像下面这样:

User.prototype.save = function(callback) {
   //do stuff to save the user
   //maybe get an error in the process, or a user record, pass them to the callback
   callback(saveError, userRecord)
}

因为saveaddUser 的预期参数相同,所以可以将回调直接传递给save

编辑: 但是,如果从 bcrypt 调用返回一个错误,我建议使用错误调用您的回调。由于您已经有一个回调来提供错误,因此抛出没有多大意义。调用者会期望回调中出现错误,所以我建议改为:

bcrypt.hash(newUser.password, salt, (err, hash) => {
        if(err) {
          callback(err, null)
          return
        }
        ...

【讨论】:

  • 没有得到这部分。 “因为 save 和 addUser 的预期参数相同,所以可以直接将回调传递给 save。”
  • user.save 方法和您的 addUser 都需要一个回调,其中 err 是第一个参数,user 是第二个参数。因此,传递给 addUser 的回调可以直接传递给 user.save,因为两者都期望相同的回调参数。
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 2015-04-27
  • 2012-08-26
  • 2013-03-13
  • 2014-05-16
  • 2016-04-16
  • 2013-06-24
  • 2017-02-04
相关资源
最近更新 更多