2016-11-14 2 views
3

Я тестирую вождение ES7 async/await proposal с помощью this module, чтобы подражать ему. Я пытаюсь сделать knex.js транзакции с ними хорошо, в качестве отправной точки.Commit/rollback транзакция knex с использованием async/wait

Пример кода:

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

Попробуйте использовать 'await' на trx.commit и trx.rollback, в противном случае не слишком уверен. –

+0

'Попробуйте использовать wait at trx.commit/trx.rollback' - не работает, но я буду копаться и опубликовать комментарий здесь. –

1

Вы могли бы добиться этого с чем-то подобным этому

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

async function() { 
    const trx = await createTransaction(); 
    ... 
    trx.commit(); 
} 
Смежные вопросы