2017-03-15 3 views
-1

Ich habe ein Node.js Tutorial verfolgt. Ich hatte immer Zweifel, wie Daten an Callback-Funktionsparameter übergeben werden. Als BeispielCallback Funktionsparameter

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

und addUser Funktion als definiert

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

Ich verstehe nicht, wie irren und Benutzer weitergegeben werden. Kann jemand das erklären?

+3

Sie werden nicht von hier übergeben. Sie werden innerhalb von 'newUser.save' übergeben. Sie geben den Callback nur an diese Funktion weiter, die sie vermutlich später aufrufen wird. – deceze

+0

werfen Sie hier einen kurzen Blick [geben Sie einen Wert von Schließung zu Haupt-Methode] (http://StackOverflow.com/A/42766223/2359679), es ist für PHP, aber ich denke, dass es die gleiche Logik ist – hassan

Antwort

0

Die Antwort ist, dass newUser.save auch einen callback Parameter und übergibt es die gleiche Art von Parametern. Sie können also den Rückruf direkt in Speichern übergeben. Ich stelle mir vor user.save in etwa wie folgt aussehen:

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

Da die erwarteten args für save und addUser gleich sind, kann der Rückruf direkt in save weitergegeben werden.

Edit: Ich würde jedoch vorschlagen, Ihren Rückruf mit dem Fehler aufzurufen, wenn man von der bcrypt Anruf zurückgegeben wird. Da Sie bereits einen Rückruf haben, um den Fehler zu geben, macht es nicht viel Sinn zu werfen. Anrufer erwarten Fehler beim Rückruf, also schlage ich folgendes vor:

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

hat dies nicht bekommen Teil. "Da die erwarteten Argumente für save und addUser identisch sind, kann der Rückruf direkt in den Speicher übergeben werden." –

+0

Sowohl die Methode user.save als auch Ihr addUser erwarten einen Callback, wobei 'err' das erste Argument und 'user' das zweite Argument ist. Aus diesem Grund konnte ein an addUser übergebener Callback direkt an user.save übergeben werden, da beide dieselben Callback-Argumente erwarten. –