Одни и те же обещания дают два разных результата - PullRequest
0 голосов
/ 06 ноября 2018

Доброе утро, люди.

Я работал над функцией, которая доставляет мне проблемы.

.then(function (values2) {
  function generateReports () {

    return Promise.all([
        Reports.InterCompaniesUsa                   .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.InterCompaniesCanada                .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Design                              .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Production                          .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),

        Reports.MonthlySalesByCustomers             .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Cashing                             .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Income                              .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.AgedTrialBalance                    .generate(periodToClose.date_start, periodToClose.date_end, {save: true})
    ])
  }

  function generateAllAccountStatement () {
    db.select('invoices.customer_id_customer')
      .distinct('invoices.customer_id_customer')
      .from('invoices')
      .where({
        'invoices.invoice_status': 'INVOICED'
      })
      .andWhere(function () {
        this.where('invoices.invoice_date', '<=', periodToClose.date_end)
          .andWhere('invoices.invoice_date', '>=', periodToClose.date_start)
      })
      .orWhere(function () {
        this.where('invoices.invoice_date', '<=', periodToClose.date_start)
          .andWhere('invoices.balance', '<>', 0)
      })
      .then(function (arrOfCustomersWithInvoicesThisMonthOrWithPostponeBalance) {
        arrOfCustomersWithInvoicesThisMonthOrWithPostponeBalance.forEach(function (oneCustomer) {
          Reports.AccountStatement.generate(periodToClose.date_end, oneCustomer.customer_id_customer, {save: true});
        })
      })
      .catch(function (err) {
        console.error(err)
      })
  }

  return Promise.all([generateReports(), generateAllAccountStatement()])
})
.then(function (allIsDoneYes) {
  return res.json(allIsDoneYes);
})
.catch(function (err) {
  console.error(err);
  return res.status(500).send(err);
})

Моя проблема: функция generateReports не разрешается. Я пытался выделить каждое обещание там все они все в порядке. Когда я заменяю функцию приведенным ниже кодом, она работает, и я удивляюсь, почему (потому что они выглядят для меня почти одинаково).

function generateReports () {
    Promise.all([
        Reports.InterCompaniesUsa                   .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.InterCompaniesCanada                .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Design                              .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Production                          .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),

        Reports.MonthlySalesByCustomers             .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Cashing                             .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.Income                              .generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
        Reports.AgedTrialBalance                    .generate(periodToClose.date_start, periodToClose.date_end, {save: true})
    ])
    .then(result => {
        return result;
    })
    .catch(err => {
        console.error(err);
    })
}

1 Ответ

0 голосов
/ 07 ноября 2018

Может быть, когда вы запускаете так много параллельных

Reports.*.generate(periodToClose.date_start, periodToClose.date_end, {save: true}),

выполняет параллельные запросы, и если в этом генерируемом коде есть ошибки или странные зависимости, они могут заполнить ваш пул и заблокировать все приложение.

Попробуйте добавить переменную среды DEBUG = knex: * в вашу оболочку и запустить код генерации отчета:

await generateReports();

И посмотрите, сможете ли вы заметить что-то странное в соединениях с базой данных или увидеть место, где зависает решение этого обещания.

Также вы можете попытаться сначала создать меньшую реализацию generateReports, которая генерирует только один отчет, а затем добавлять к нему больше отчетов, пока не найдете комбинацию, в которой обещание больше не будет разрешаться.

...