Как советуют выше, проще всего использовать async-await и цикл for-of, но если нет возможности их использовать, то тогда можно просто построить цепочку промисов, примерно вот так:
const promises = [
Promise.resolve("first"),
Promise.resolve("second"),
Promise.resolve("last")
];
function makePromiseChain(arrayOfPromises) {
return arrayOfPromises.reduce((acc, current) => acc.then(() => current, Promise.resolve()));
}
makePromiseChain(promises).then(() => {
console.log("done");
});
Если хочется часть запросов выполнять параллельно, например: первые 3 запроса параллельно, затем следующие 3 параллельно и т.д., то можно массив промисов разбить на чанки:
// если в проекте есть lodash, то в нём есть метод _.chunk
function makeChunks(array, chunkSize) {
const chunks = [];
for (let i = 0, j = array.length; i < j; i += chunkSize) {
const chunk = array.slice(i, i + chunkSize);
chunks.push(chunk);
}
return chunks;
}
// выполняем запросы параллельно по 3 штуки
makePromiseChain(
makeChunks(promises, 3)
.map(chunk => Promise.all(chunk))
).then(() => console.log('Done'))