2017-03-15 182 views
-1

我一直在關注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); 
     }); 
    }); 
} 

我不知道如何犯錯誤和用戶傳遞。有人可以解釋這個嗎?

+3

它們不會從這裏傳遞。它們從'newUser.save'中傳遞。你只是將'callback'傳遞給那個函數,這個函數大概會最終調用它。 – deceze

+0

在這裏快速看看[返回一個值從封閉到主要方法](http://stackoverflow.com/a/42766223/2359679),它的PHP,但我認爲它是相同的邏輯 – hassan

回答

0

答案是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預期ARG遊戲一樣,回調可以通過直入save

編輯: 但是,如果從bcrypt調用中返回一個錯誤,我會建議調用您的回調。既然你已經有了一個回調來給出錯誤,拋出並不合理。呼叫者會預期在回調中出現錯誤,所以我建議用這種方式代替:

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

沒有得到這個部分。 「因爲保存和addUser的預期參數是相同的,所以回調可以直接傳入保存。」 –

+0

user.save方法和addUser都需要一個回調函數,其中'err'是第一個參數,'user'是第二個參數。正因爲如此,傳遞給addUser的回調函數可以直接傳遞給user.save,因爲兩者都需要相同的回調參數。 –