如何避免nodejs中的回调地狱为sequelize

时间:2014-11-18 18:14:02

标签: node.js callback sequelize.js

我正在使用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。

请在这方面帮助我!

提前致谢!

2 个答案:

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