我试图在Node中重构一些javascript代码,我在将参数传递给其他函数回调的函数时遇到了一些麻烦。例如,这是我的一组回调:
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();
});
});
});
我想将回调重构为这样的东西,所以看起来更干净,没有像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();
}
}
我尝试做的问题是,我似乎找不到在函数之间传递相关参数的方法,以使重构工作。
如果有人能给我一些关于这一点的指示,那就很棒
答案 0 :(得分:2)
有两种不同的方法可以做到这一点。要么传递用户,要么传递下一个。
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);
});