Pg-promise - 可能参与事务/任务的可重用查询



我正在尝试实现一种重用模式,其中查询函数如果参与现有事务/任务,则可能会接收参数 trx=tx/task,并重用该 tx/task 上下文......否则,如果 trx=undefined 传入,则为查询创建一个新任务。这个想法是让函数与它是否被单独使用或参与高阶区块交易无关。

我想要的(理想情况下)是一个 promise 函数,它将返回一个任务上下文,以便我可以像下面这样写干净(这不起作用):

async function trxRunQueries(trx:ITask<any>|undefined = undefined):Promise<any[]>
{
if(!trx)
trx=await db.task(); // if !trx then create new task context from db
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}

然而,似乎 db.task() 需要在 cb 参数中执行上下文查询,但它让我悬而未决,想知道如何在不将代码写出两次的情况下实现所需的模式——一次使用 db.task(trx =>) 包装器,另一个直接执行 trx.many(...)。

我想知道是否可以做一些黑客的事情,如下所示,以实现这种参与事务的模式,它是否会起作用(或者它真的不是推荐的做事方式)——或者有我没有想到的更好方法?

async function runQueries(trx:ITask<any>):Promise<any[]>
{
const dataset1 = await trx.many(`select * from tableA`);
const dataset2 = await trx.many(`select * from tableB`);
return [dataset1,dataset2];
}
async function trxRunQueries(trx:ITask<any>|undefined = undefined ):Promise<any[]>
{
let result:any[]=[];
try {
// If trx not passed in the create task context
if(!trx)
await db.task(async trx => {result=await runQueries(trx)})
else
result=await runQueries(trx);
return result;
}
catch (err) {
throw(err);
}
}

这种模式由 pg-promise-demo 实现,它使用事件扩展来扩展具有上下文无关的实体存储库的数据库协议。

最新更新