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

Javascript Pg promise-可参与事务/任务的可重用查询,javascript,node.js,async-await,pg-promise,Javascript,Node.js,Async Await,Pg Promise,我正在尝试实现一种重用模式,在这种模式下,如果查询函数参与现有事务/任务,它们可能会接收参数trx=tx/task,并重用该tx/task上下文。。。否则,如果传入trx=undefined,则为查询创建一个新任务。其思想是让函数不知道它是被单独使用,还是参与高阶块事务 理想情况下,我想要的是一个promise函数,它将返回一个任务上下文,这样我就可以像下面这样干净地编写任务,但它不起作用: async function trxRunQueries(trx:ITask<any>|un

我正在尝试实现一种重用模式,在这种模式下,如果查询函数参与现有事务/任务,它们可能会接收参数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.tasktrx=>wrapper,另一次执行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);
  }
}

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

Hi Vitaly,。。。在解释如何使用extend event允许我的查询批处理函数在传入参数时重用现有任务/tx,或者为批处理创建新任务时,您是否可以更详细一些?我很难把我的头绕在它周围。。。谢谢你的耐心@AndrewOoi如果您遵循演示中显示的模式,则不需要传递任何上下文,它会自动通过存储库工作。正确的上下文总是自动传递到任务和事务中。