你如何重构嵌套callback,并将parameter passing给节点中的每个函数?

我试图在Node中重构一些JavaScript代码,并且在将parameter passing给其他函数的callback函数时遇到一些问题。 例如,这是我的callback集:

userSchema.pre("save",function(next){ var user = this; if (!user.isModified(value)) {return next();} bcrypt.genSalt(10,function(err,salt){ if (err) {return next(err);} bcrypt.hash(user.password,salt,function(err,hash){ if (err) {return next(err);} user.password = hash; next(); }); }); }); 

我想重构callback这样的东西,所以看起来更干净,没有像async或q外部库这样做

 userSchema.pre("save",function(next){ var user = this; if (!user.isModified(value)) {return next();} bcrypt.genSalt(10,saltCallback(user)); }); function saltCallback(user){ return function(err,salt){ bcrypt.hash(user,salt,hashCallback(user)); } } function hashCallback(user){ return function(err,hash){ if (err) {return next(err);} user.password = hash; next(); } } 

我试图做的问题是,我似乎无法find一种方法来传递函数之间的依赖参数,以获得重构的工作。

如果有人可以给我一些这个很好的指针

有两种不同的方法来做到这一点。 通过两者,用户和下一个。

 userSchema.pre("save",function(next){ var user = this; if (!user.isModified(value)) {return next();} bcrypt.genSalt(10,saltCallback(user, next)); }); function saltCallback(user, next){ return function(err,salt){ bcrypt.hash(user.password,salt,hashCallback(user, next)); } } function hashCallback(user, next){ return function(err,hash){ if (err) {return next(err);} user.password = hash; next(); } } 

或者在第一个函数里面定义两个函数。

 userSchema.pre("save",function(next){ function saltCallback(err,salt){ bcrypt.hash(user.password,salt,hashCallback); } function hashCallback(err,hash){ if (err) {return next(err);} user.password = hash; next(); } var user = this; if (!user.isModified(value)) {return next();} bcrypt.genSalt(10,saltCallback); });