Переписать можно значительно улучшить, приняв пару простых правил стиля: (1) нет необходимости создавать разрешенное обещание и затем связывать его (на самом деле, большинство посчитает это анти-паттерном), (2) Обещания, выполняемые вместе с помощью итерации массива операндов, являются идеальным приложением массива .map (не уменьшают), (3) наиболее важные, меньшие, проверяемые, возвращающие обещание функции всегда раскрывают тайну.
Собрав все это вместе, основная функция может быть такой простой, как эта ...
function loopOverOnce(agegroup) {
let statsPromise = Stats(agegroup);
let oStatsPromise = getOverallStats();
let grpPromise = GetGroups(agegroup).then(function(groups) {
return getStandingsAndFixturesForGroups(groups, agegroup);
});
return Parse.Promise.all([statsPromise, oStatsPromise, grpPromise]);
}
Давайте напишем getStandingsAndFixturesForGroups
. Это только работа будет составлять карту групп и сводных обещаний, чтобы сделать работу над каждым ...
function getStandingsAndFixturesForGroups(groups, agegroup) {
let promises = groups.map(function(group) {
return getStandingsAndFixturesForGroup(group, agegroup);
});
return Parse.Promise.all(promises);
}
Теперь, getStandingsAndFixturesForGroup
, функция для выполнения асинхронной работы над одной группой, условно для части работы ...
function getStandingsAndFixturesForGroup(group, agegroup) {
let promises = (group != "KO")? [ Standings(agegroup, grp) ] : [];
promises.push(GetFixtures(agegroup, group));
return Parse.Promise.all(promises); // this is your standings promise (conditionally) and fixtures promise
}
Готово. Я бы протестировал этот код в обратном порядке, который представлен здесь.
РЕДАКТИРОВАТЬ ОП также спрашивает, как выполнить несколько обещаний, последовательно, с вкраплением времени ожидания. Вот мой совет.
Во-первых, немного более простая версия вашей функции задержки, которая является хорошим примером, когда является правильным для создания нового обещания (потому что внизу ничего не нужно вызывать, чтобы получить его)
function delay(interval) {
return new Promise(function(resolve, reject){
setTimeout(function() {resolve();}, interval);
});
};
А сокращение - это хороший способ составить список обещаний, включая разбросанные задержки ...
getAgeGroupList().then(function (loopAgeList) {
loopAgeList.reduce(function(promise, agegroup) {
return promise.then(function() {
let promises = [loopOverOnce(agegroup), delay(15000)];
return Promise.all(promises);
});
}, Promise.as());
});
Пара замечаний: в результате получается последовательность, такая как loopOverOnce, timeout, loopOverOnce, timeout, ... и т. Д. Если вы хотите сначала установить тайм-аут, измените порядок маленькой цепочки во внутреннем цикле:
[ delay(15000), loopOverOnce(agegroup) ]
Последнее замечание: все это можно сделать еще короче и красивее, если использовать синтаксис жирной стрелки ES6 для анонимных функций, например,
loopAgeList.reduce((promise, agegroup) => {
promise.then(() => Promise.all([loopOverOnce(agegroup), delay(15000)]));
}, Promise.as());