避免与asynchronouscallback地狱,使用其他模块的function

我有一个用户模块,我正在定义跨代码使用的函数。 当我创build密码时,我想利用这些function:

用户模块:

//insert a local user into the database User.prototype.insertLocalUser = function (email, password, cb) { var sql = "INSERT INTO VCUSER ( VCUSER_EMAIL, VCUSER_PASSWORD ) values ('" + email + "','" + password + "')"; db.get().query(sql, function (err, rows) { if (err) return cb(err); return cb(err, rows); }); }; //generate hash function for password User.prototype.generateHash = function (password, cb) { bcrypt.genSalt(10, function(err, salt) { if (err) return cb(err); bcrypt.hash(password, salt, null, function(err, hash) { return cb(err, hash); }); }); }; 

Passport.js:

这里是我这样做的地方,虽然这不是太糟糕,但我目前坚持试图了解如何解决一个简单的嵌套callback问题与asynchronous,我不想向前移动一个更复杂的callback巢。

 //minor callback hell user.findByEmail(email, function (err, rows) { if (err) return done(err); if (rows.length) { //user must already exist prompt user return done(null, false, req.flash('signupMessage', 'That email is already taken.')); } else { user.generateHash(password, function (err, hash) { if (err) return done(err); //insert a user with the newly hashed password into the database user.insertLocalUser(email, hash, function (err, rows) { if (err) return done(err); user.VCUSER_USERID = rows.insertId; //return the user we are done, they should be serialized and redirected return done(null, user); }); }); } }); 

我正在尝试做这样的事情:

 //first search to see if the user already exists user.findByEmail(email, function (err, rows) { if (err) return done(err); if (rows.length) { //user must already exist prompt user return done(null, false, req.flash('signupMessage', 'That email is already taken.')); } else { async.series([ //code avoid callback hell here user.generateHash... { } user.insertLocalUser() { } ]); } }); 

我已经看了不less例子,但我似乎无法find某人在asynchronous调用外部模块代码。

@ Bergi的反馈意见,我将会看到承诺。 不pipe有没有人想要这样做是我的解决scheme。 我强烈build议阅读asynchronous瀑布文档,这是我发现的一些更好的材料。

 async.waterfall([ //look in database for existing users with email inputed return as results function findUser(cb) { var sql = "SELECT * FROM VCUSER WHERE VCUSER_EMAIL = '" + email + "'"; db.get().query(sql, function (err, result) { if (err) { cb(err); } cb(null, result); }); }, //check if there were any results, if so prompt, if not continue with user creation function generateHash(result, cb) { if (result.length) { return done(null); } //TODO determine how this is handled back to UI bcrypt.genSalt(10, function(err, salt) { if (err) { cb(err); } bcrypt.hash(password, salt, null, function(err, hash) { cb(null, hash); }); }); }, //using recently generated hash create a user function insertNewUser(hash, cb) { var sql = "INSERT INTO VCUSER ( VCUSER_FIRSTNAME, VCUSER_LASTNAME, VCUSER_EMAIL, VCUSER_PASSWORD ) " + "values ('" + req.body.firstName + "','" + req.body.lastName + "','" + email + "','" + hash + "')"; db.get().query(sql, function (err, rows) { if (err) { cb(err); } cb(null, rows); }); } ], function (err, rows) { if (err) { return done(err); } else { user.VCUSER_USERID = rows.insertId; return done(null, user) } }); })