PG承诺-可能参与事务/任务的可重用查询

时间:2019-07-15 08:34:06

标签: javascript node.js async-await pg-promise

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

我所希望的(理想情况下)是一个承诺函数,该函数将返回任务上下文,以便我可以像下面这样写得很整洁(不起作用):

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);
  }
}

1 个答案:

答案 0 :(得分:0)

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