如何重构嵌套回调并将参数传递给节点中的每个函数?

时间:2015-05-15 01:49:21

标签: javascript node.js express

我试图在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();
    }
}

我尝试做的问题是,我似乎找不到在函数之间传递相关参数的方法,以使重构工作。

如果有人能给我一些关于这一点的指示,那就很棒

1 个答案:

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