[英]Async call based on a response from a previous call, avoiding callback hell
[英]Avoiding callback hell with async, using functions from other modules
我有一個用戶模塊,我在其中定義要在代碼中使用的函數。 當我創建密碼時,我想利用這些功能:
用戶模塊:
//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:
這就是我這樣做的地方,當然這還不錯,但我目前一直在嘗試了解如何使用 async 解決簡單的嵌套回調問題,而且我不想繼續使用更復雜的回調嵌套.
//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() {
}
]);
}
});
我看過很多例子,但我似乎找不到有人在異步內部調用外部模塊代碼的地方。
感謝@Bergi 的反饋,我將研究承諾。 不管是否有人想要這樣做,這里都是我的解決方案。 我強烈建議查看異步瀑布文檔,這是我發現的一些更好的材料。
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)
}
});
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.