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

标签 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();
    }
}

我正在尝试做的问题是,我似乎无法找到一种方法在函数之间传递依赖参数以使此重构发挥作用。

如果有人能给我一些建议,那就太好了

最佳答案

有两种不同的方法可以做到这一点。要么传递 user 和 next。

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

关于javascript - 如何重构嵌套回调并将参数传递给 Node 中的每个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30250251/

相关文章:

javascript - 在Rails中,我可以在JS响应后在 Controller 操作中执行ActionMailer逻辑吗?

javascript - 为什么我的推送函数以嵌套方式存储我的数据?

javascript - 如何为 Protobuf 生成的 JavaScript 文件设置 VSCode 智能感知?

javascript - 当使用 Sequelize 和 react-native 时,Metro 错误不支持动态需求定义

javascript - Express.js : Get user's referer url when they post

node.js - firebase node.js/express.js 添加多个 firebase 函数

javascript - 如何删除所有出现的 .从阵列

node.js - NodeJS : get information on a process from the process ID

node.js - Node/Express:stream.pipe()上没有下载

javascript - 使用 Angular 2 从 Express 服务器获取数据