Tek bir kitaplık işleminde birkaç veritabanı tablosunu güncellemek istiyorum. Kodumu yeniden düzenleyen bazı yardımları kullanabilirim. Düğüm için yeni ve vaatlerin iyi bir kavrayışına sahip değilim, ama aşağıdaki yuvalanmış yapı çok güzel değil ve umarım daha temiz bir yol olduğunu umuyorum. Herhangi bir yardım takdir edilecektir.Kitap rafı işleminde yuvalanmış yapı nasıl düzeltilir
function insertUser(user, cb) {
bookshelf.transaction(function(t) {
var key = user.key;
Developer.forge({key: key})
.fetch({require: true, transacting: t})
.then(function(developerModel) {
var devID = developerModel.get('id');
Address.forge(user.address)
.save(null, {transacting: t})
.then(function(addressModel) {
var addressID = addressModel.get('addressId');
Financial.forge(user.financial)
.save(null, {transacting: t})
.then(function(financialModel) {
var financialID = financialModel.get('financialId');
var userEntity = user.personal;
userEntity.addressId = addressID;
userEntity.developerId = devID;
userEntity.financialId = financialId;
User.forge(userEntity)
.save(null, {transacting: t})
.then(function(userModel) {
logger.info('saved user: ', userModel);
logger.info('commiting transaction');
t.commit(userModel);
})
.catch(function(err) {
logger.error('Error saving user: ', err);
t.rollback(err);
});
})
.catch(function(err) {
logger.error('Error saving financial data: ', err);
t.rollback(err);
})
})
.catch(function(err) {
logger.error('Error saving address: ', err);
t.rollback(err);
})
})
.catch(function(err) {
logger.error('Error saving business : ', err);
t.rollback(err);
})
})
.then(function(model) {
logger.info(model, ' successfully saved');
return Promise.resolve(respond.success({userId: model.get('userId')}));
})
.catch(function(err) {
logger.error(err, ' occurred');
return Promise.reject(new DatabaseError('Unable to write user to database due to error ', err.message));
})};
Çok daha iyi
, t:bir başka yolu
Promise.join
kullanmaktır SağoI! –call() yöntemini kullanmanın nedeni nedir? Biliyorum, bu kestirme http://bluebirdjs.com/docs/api/call.html ama neden sadece doğrudan modelden değil? – 1mike12