Pg-promise - 可能参与 transaction/task 的可重用查询

Pg-promise - Reusable queries that may participate in a transaction/task

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

我想要的(理想情况下)是一个 promise 函数,它将 return 一个任务上下文,这样我就可以像下面这样干净地编写(这是行不通的):

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, which uses event extend 实现,以使用 context-agnostic 个实体存储库扩展数据库协议。