2016-11-14 183 views
3

我正在測試ES7 async/await proposal使用this module來模擬它。我試圖讓knex.js交易與他們一起發揮出色,作爲一個起點。使用異步/等待提交/回滾knex事務

示例代碼:

async function transaction() { 
    return new Promise(function(resolve, reject){ 
    knex.transaction(function(err, result){ 
     if (err) { 
     reject(err); 
     } else { 
     resolve(result); 
     } 
    }); 
    }); 
} 

// Start transaction from this call 

insert: async (function(db, data) { 
const trx = await(transaction()); 
const idUser = await(user.insertData(trx, data)); 

return { 
    idCidUserstomer: idUser 
    } 
}) 

我如何commit()rollback()如果交易成功或失敗?

回答

2

大廈關閉此Knex Transaction with Promises的,它看起來像它應該是沿着這些路線:

// assume `db` is a knex instance 

insert: async (function(db, data) { 
    const trx = db.transaction(); 
    try { 
    const idUser = await(user.insertData(trx, data)); 
    trx.commit(); 
    } catch (error) { 
    trx.rollback(); 
    throw error; 
    } 

    return { 
    idUser: idUser 
    } 
}) 
+0

1注意這裏的東西來實現這一點 - 對於一些奇怪的原因是,將'return {idCustomer:idCustomer}'部分放在'try'塊內部會使其變得很好,否則會掛起,如'try..catch'下面的部分不運行 –

+0

嘗試使用在trx.commit和trx.rollback上等待,否則不太確定。 –

+0

'嘗試在trx.commit/trx.rollback上使用await - 沒有工作,但我會在這裏發掘並發表評論。 –

1

你也許可以用類似上述

function createTransaction() { 
    return new Promise((resolve) => { 
    return knex.transaction(resolve); 
    }); 
} 

async function() { 
    const trx = await createTransaction(); 
    ... 
    trx.commit(); 
}