2015-01-27 31 views
5

Tôi muốn cập nhật một số bảng cơ sở dữ liệu trong một giao dịch giá sách đơn. Tôi có thể sử dụng một số trợ giúp tái cấu trúc mã của tôi. Tôi mới vào nút và không có một sự hiểu biết tốt về lời hứa, nhưng cấu trúc lồng nhau dưới đây không phải là rất đẹp, và tôi hy vọng có một cách sạch hơn. Bất kỳ trợ giúp sẽ được đánh giá cao.Cách sửa cấu trúc lồng nhau trong giao dịch bookshelfjs

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

Trả lời

4

Lưu những lời hứa-cho-kết quả cho các biến và bạn có thể sử dụng chúng sau này trong trận chung kết sau đó, nơi nó được bảo đảm rằng họ được đáp ứng và do đó giá trị của chúng có thể được lấy ra với .value() đồng bộ

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

Một cách khác là sử dụng Promise.join:

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

tốt hơn nhiều, t hanks! –

+1

lý do sử dụng phương thức call() là gì? Tôi biết nó là viết tắt http://bluebirdjs.com/docs/api/call.html nhưng tại sao không chỉ trực tiếp gọi nó từ mô hình? – 1mike12

Các vấn đề liên quan