Я пытаюсь создать шаблон повторного использования, при котором функции запросов мая получают параметр trx=tx/task, если они участвуют в существующей транзакции/задаче, и повторно используют этот контекст tx/task... в противном случае, если передано 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);
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Такой шаблон реализуется pg-обещание-демо, который использует событие продлевать для расширения протокола базы данных репозиториями сущностей, не зависящими от контекста.
@AndrewOoi Если вы следуете шаблону, показанному в демонстрации, вам не нужно передавать какой-либо контекст, он работает автоматически через репозитории. И правильный контекст всегда автоматически передается в задачи и транзакции.
Привет, Виталий, ... не могли бы вы быть немного более подробным в объяснении, как я могу использовать событие extend(), чтобы разрешить моей пакетной функции запроса повторно использовать существующую задачу/tx, если она передана в параметре, или иным образом создать новую задачу для партия? У меня проблемы с пониманием этого... спасибо за ваше терпение!