Есть несколько проблем с этим кодом:
requestJahrStatistic
не должно быть async
, если он сообщает о своих результатах путем обратного вызова
Этот шаблон используется в нескольких местах:
.then(async resolved => {
var res = await resolved
return res
});
Это не имеет смысла (если только ... см. # 5) и может быть полностью удалено.
Нет причины для map
обратного вызова async
, так как вы не используете await
внутри него.
Вы повторяете свою логическую оболочкуsendHTTPRequest
в обещании и не может обработать ошибки в нем.Не повторяйте себя, создайте для этого функцию.
Похоже, connection.statistic_id
и connection.reporting_period
как-то используются HTTP-запросами.Они не должны быть, это жуткое действие на расстоянии.:-) Но если они есть, то нет этого может быть параллельно, так как вам нужно дождаться запроса, используя заданные statistic_id
и reporting_period
, чтобы завершить следующий.
Вы не обрабатываете ошибки.
Если я предполагаю, что connection.reporting_period
используется HTTP-запросами, это означает, что они не могут перекрыватьсятак что ничего из этого не может быть параллельно, и вы не можете использовать Promise.all
для него.Вам понадобится что-то вроде:
Если connection.reporting_period
не используется HTTP-запросами, все это может быть параллельным:
function sendHTTPRequestP(item) {
return new Promise((resolve, reject) => {
sendHTTPRequest(item, result => {
if (/*an error occurred*/) {
reject(new Error(/*...*/));
} else {
resolve(result);
}
});
})
}
// Completely serial because of spooky action at a distance with
// `connection.statistic_id` and `connection.reporting_period`
function requestJahrStatistic(jahreStatistic, callback) {
Promise.resolve(async () => {
const results = [];
for (const item of jahreStatistic) {
const periods = getReportingPeriod(item.period);
connection.statistic_id = item.statistic_id;
connection.reporting_period = periods.prevYear;
const result1 = await sendHTTPRequestP(item);
connection.reporting_period = periods.actualYear;
const result2 = await sendHTTPRequestP(item);
connection.reporting_period = periods.nextYear;
const result3 = await sendHTTPRequestP(item);
results.push([result1, result2, result3]);
}
return results;
})
.then(callback)
.catch(error => {
// Handle/report error, call `callback` with the appropriate error flag
});
}
Или что-то подобноеэти строки.Обратите внимание, что callback
получит массив массивов.Внешний массив будет иметь столько записей, сколько и jahreStatistic
;каждая из этих записей будет массивом результатов трех HTTP-вызовов.
Если вы можете что-то изменить, чтобы каждая операция принимала аргументы, а не пугающее действие на расстоянии (я вижу, что sendHTTPRequest уже имеет item
так можно предположительно получить statistic_id
из него, поэтому нам просто нужно передать period
), вы можете сделать вещи параллельными:
function sendHTTPRequestP(item, reporting_period) {
return new Promise((resolve, reject) => {
sendHTTPRequest(item, reporting_period, result => {
if (/*an error occurred*/) {
reject(new Error(/*...*/));
} else {
resolve(result);
}
});
})
}
function requestJahrStatistic(jahreStatistic, callback){
Promise.all(
jahreStatistic.map((item) => {
const periods = getReportingPeriod(item.period);
return Promise.all([
sendHTTPRequestP(item, periods.prevYear),
sendHTTPRequestP(item, periods.actualYear),
sendHTTPRequestP(item, periods.nextYear)
]);
})
)
.then(callback)
.catch(error => {
// Handle/report error, call `callback` with the appropriate error flag
});
}
или что-то в этом роде.