我正在使用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。
请在这方面帮助我!
提前致谢!
答案 0 :(得分:4)
Sequelize 2.0附带本机承诺,因此您无需在代码中手动要求使用promise lib。使用2.0,您的代码段可以写成:
db.Role.findAll().bind({}).then(function(roles) {
this.roles = roles;
return db.User.findAll({where: {permission: 'coach'}});
}).then(function(coaches) {
res.render('users/edit_profile', {successFlash: successFlash, user: user, roles: this.roles, coaches: coaches});
}).catch(function(errors) {
console.log("Error", errors);
res.render('dashboard', {successFlash: successFlash, errors: errors});
});
您只需要一个catch
块,因为当您return
承诺时,任何错误都会传播到链的顶部。
bind({})
部分在您的promise链中的所有函数中都有一个空对象,因此您可以以这种方式传递上下文。如果您也可以bind(this)
,那么如果您希望能够从外部环境中访问某些内容,而无需执行惯用语var self = this
答案 1 :(得分:0)
试试这个:
get_user: function(req, res) {
var users = null;
func.get_users(function(result){
if (result==null) //handle error
res.render('users/get_users', {users: users});
});
}
get_users: function(callback) {
db.User.findAll().success(function(users){
callback(users);
}).error(function(err){
callback(null);
});
}