Это может быть решено с помощью рекурсии.
Идея состоит в том, что изначально вы отправляете максимально допустимое количество запросов, и каждый из этих запросов должен рекурсивно продолжать отправлять сам себя по завершении.
function batchUpload(files, concurrentRequestsLimit) {
return new Promise(resolve => {
var responses = [];
var index = 0;
function recursiveUpload() {
if (index === files.length) {
return;
}
upload_file(files[index++]).then(r => {
responses.push(r);
if (responses.length === files.length) {
resolve(responses);
} else {
recursiveUpload();
}
});
}
for (var i = 0; i < concurrentRequestsLimit; i++) {
recursiveUpload();
}
});
}
var files = [
'file_1',
'file_2',
'file_3',
...
'file_100'
];
batchUpload(files, 5).then(responses => {
console.log(responses);
});