同样的承诺给出两个不同的结果
Same promises gives two different results
大家早上好。
我一直在研究一个给我带来问题的函数。
.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);
})
}
可能是当你运行宁这么多并行
Reports.*.generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
并行查询,如果生成的代码有一些错误或奇怪的依赖关系,它们可能会填满您的池并阻止整个应用程序。
尝试将 DEBUG=knex:* 环境变量添加到您的 shell 和 运行 您的报告生成代码中:
await generateReports();
看看你是否能发现数据库连接有什么奇怪的地方,或者看看解决这个承诺的地方。
您也可以先尝试制作更小的 generateReports 实现,它只生成一个报告,然后向其中添加更多报告,直到您找到 promise 不再解析的组合。
大家早上好。
我一直在研究一个给我带来问题的函数。
.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);
})
}
可能是当你运行宁这么多并行
Reports.*.generate(periodToClose.date_start, periodToClose.date_end, {save: true}),
并行查询,如果生成的代码有一些错误或奇怪的依赖关系,它们可能会填满您的池并阻止整个应用程序。
尝试将 DEBUG=knex:* 环境变量添加到您的 shell 和 运行 您的报告生成代码中:
await generateReports();
看看你是否能发现数据库连接有什么奇怪的地方,或者看看解决这个承诺的地方。
您也可以先尝试制作更小的 generateReports 实现,它只生成一个报告,然后向其中添加更多报告,直到您找到 promise 不再解析的组合。