Pg-promise — многократно используемые запросы, которые могут участвовать в транзакции/задаче

Я пытаюсь создать шаблон повторного использования, при котором функции запросов мая получают параметр 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);
  }
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
343
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Такой шаблон реализуется pg-обещание-демо, который использует событие продлевать для расширения протокола базы данных репозиториями сущностей, не зависящими от контекста.

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

Andrew Ooi 16.07.2019 10:21

@AndrewOoi Если вы следуете шаблону, показанному в демонстрации, вам не нужно передавать какой-либо контекст, он работает автоматически через репозитории. И правильный контекст всегда автоматически передается в задачи и транзакции.

vitaly-t 17.07.2019 21:33

Другие вопросы по теме