gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:53:21 26 4
gpt4 key购买 nike

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

我想要的(理想情况下)是一个 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 实现,它使用事件 extend使用与上下文无关的实体存储库扩展数据库协议(protocol)。

关于javascript - Pg-promise - 可能参与事务/任务的可重用查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57036017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com