2015-01-27 16 views
5

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

cevap

4

kaydet değişkenlere sözler-sonuçları-için ve onlar yerine getirildiği olacağının hiçbir garantisi yoktur ve bu nedenle onların değeri .value() eşzamanlı

function insertUser(user, cb) { 
    return bookshelf.transaction(function(t) { 
    var key = user.key; 

    var devID = Developer.forge({key: key}) 
     .fetch({require: true, transacting: t}) 
     .call("get", "id"); 

    var addressID = devID.then(function() { 
     return Address.forge(user.address).fetch({require: true, transacting: t}) 
    }).call("get", "addressId"); 

    var financialID = addressModel.then(function() { 
     return Financial.forge(user.financial).save(null, {transacting: t}) 
    }).call("get", "financialId"); 

    var userModel = financialID.then(function() { 
     var userEntity = user.personal; 
     userEntity.addressId = addressID.value(); 
     userEntity.developerId = devID.value(); 
     userEntity.financialId = financialID.value(); 
     return User.forge(userEntity).save(null, {transacting: t}); 
    }); 

    return userModel.then(function(userModel) { 
     logger.info('saved user: ', userModel); 
     logger.info('commiting transaction'); 
     t.commit(userModel); 
    }).catch(function(e) { 
     t.rollback(e); 
     throw e; 
    }); 
    }); 
} 
.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)); 
})}; 

ile alınabilir o zaman nerede nihai bunları daha sonra kullanabilirsiniz
function insertUser(user, cb) { 
    return bookshelf.transaction(function(t) { 
    var key = user.key; 

    var devID = Developer.forge({key: key}) 
     .fetch({require: true, transacting: t}) 
     .call("get", "id"); 

    var addressID = devID.then(function() { 
     return Address.forge(user.address).fetch({require: true, transacting: t}) 
    }).call("get", "addressId"); 

    var financialID = addressModel.then(function() { 
     return Financial.forge(user.financial).save(null, {transacting: t}) 
    }).call("get", "financialId"); 

    var userModel = Promise.join(devID, addressID, financialID, 
    function(devID, addressID, financialID) { 
     var userEntity = user.personal; 
     userEntity.addressId = addressID; 
     userEntity.developerId = devID; 
     userEntity.financialId = financialID; 
     return User.forge(userEntity).save(null, {transacting: t}); 
    }); 

    return userModel.then(function(userModel) { 
     logger.info('saved user: ', userModel); 
     logger.info('commiting transaction'); 
     t.commit(userModel); 
    }).catch(function(e) { 
     t.rollback(e); 
     throw e; 
    }); 
    }); 
} 
.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)); 
})}; 
+0

Çok daha iyi

, t:

bir başka yolu Promise.join kullanmaktır SağoI! –

+1

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

İlgili konular