您需要从内部查询中返回一个Promise,以便将外链与此链接在一起。
您还会吞下任何错误,因为您不会重新抛出它们-最好使用
.catch()这个原因,因为这样可以使发生的事情更加清晰-这就是正常
try-catch语句会发生的情况。
knex.transaction(function(t) { return knex('foo') .transacting(t) .insert({id:"asdfk", username:"barry", email:"barry@bar.com"}) .then(function() { return knex('foo').where('username','=','bob').update({email:"bob@foo.com"}); }) .then(t.commit) .catch(function(e) { t.rollback(); throw e; })}).then(function() { // it worked}).catch(function(e) { // it failed});为了更好地理解它,下面是被“模拟”的同步版本:
try { var t = knex.transaction(); try { knex("foo") .transacting(t) .insert({id:"asdfk", username:"barry", email:"barry@bar.com"}); knex("foo") .where('username','=','bob') .update({email:"bob@foo.com"}); t.commit(); } catch (e) { t.rollback(); // As you can see, if you don't rethrow here // the outer catch is never triggered throw e; } // It worked}catch (e) { //It failed}


