2014-08-27 3 views
0

Разрабатывая успокоительное приложение с узлами, expressjs и sequelizejs, я обнаружил, что мой код выполняет много обратных вызовов.Sequelize.js создает слишком много обратных вызовов

В частности, когда я имею дело с объединением и созданием объекта в БД так:

// db is my database object 

// here are my db entities : header, line and thing 
// header has many line 
// line belongs to header 
// line has one thing 
// thing has many line 

db.line.create().success(function(line){ 
    db.header.find({where:{id : header_id}}).success(function(header){ 
    header.addLine(line).success(function(){ 
     db.thing.find({where:{id : thing_id}}).success(function(thing){ 
     line.setThing(thing).success(function(){ 
      // OK 
     }); 
     }); 
    }); 
    }); 
}); 

Я хотел использовать return заявление внутри обратного вызова ошибки, но я не смог бы получить созданные данные.

Как вы думаете, есть ли другой способ совершать такие операции без всех обратных вызовов?

+2

StrongLoop имеет хорошую статью, относящуюся к этому http://strongloop.com/strongblog/node-js- callback-hell-promises-generatorators/ – Jordonias

+0

Я посмотрю, спасибо :) – nobe4

+1

Sequelize 2.0 изначально поддерживает обещания через [Bluebird] (https://github.com/petkaantonov/bluebird) –

ответ

1

С предыдущим примером это то, что обещает будут выглядеть подобные в моем примере создания и связывания:

// db is my database object 

// here are my db entities : header, line and thing 
// header has many line 
// line belongs to header 
// line has one thing 
// thing has many line 

db.line.create().success(function(line){ 
    db.header.find({where:{id : header_id} 
    }).then(function(header){ 
    header.addLine(line); 
    }).then(function(){ 
    return db.thing.find({where:{id : thing_id} 
    }).then(function(thing){ 
    line.setThing(thing); 
    }).then(function(){ 
    // OK 
    }).catch(function(err){ 
    // handle errors of association 
    }); 
.error(function(err){ 
    // handle errors of creation 
}); 
Смежные вопросы