【发布时间】:2014-11-18 18:14:01
【问题描述】:
我正在使用 Sequelize 并最终陷入回调地狱:
db.Role.findAll().success(function(roles) {
db.User.findAll({where: {permission: 'coach'}}).success(function(coaches) {
res.render('users/edit_profile', {successFlash: successFlash, user: user, roles: roles, coaches: coaches});
}).error(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});
}).error(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});
我想避免回调地狱并使代码更可重用。有没有办法在不使用异步、承诺等的情况下做到这一点?
假设我写了这样的东西..
get_user: function(req, res) {
var users = null;
users = func.get_users();
res.render('users/get_users', {users: users});
}
get_users: function() {
db.User.findAll().success(function(users){
return users;
}).error(function(err){
return null;
});
}
这种方法的问题在于,get_user 先渲染页面,然后执行来自get_users 的回调,给我的用户总是 null。
请在这方面帮助我!
提前致谢!
【问题讨论】:
-
回调地狱?在哪里?我很确定回调地狱通常是指您在回调(...等)内部的回调内部有回调的地方。你有 promise 风格的回调,这可能和你得到的一样好。如果你不喜欢回调,我不会推荐一个涉及大量使用回调的框架。
-
感谢您的反馈。我担心的是,我想让代码更可重用。使用上面的第一种方法,如果我要在控制器中编写另一个函数,我会再次编写所有查询(可能顺序会有所不同)。我想将所有查询放在一个单独的控制器中,在不同的函数中,然后只调用其他控制器中的函数。我希望,你明白我的意思。 :)
标签: node.js callback sequelize.js