В async есть parallelLimit, но тут писать всего несколько строк кода
общая очередь делается примерно так:
// последовательная обработка очереди
function runWorker(func, getNext) {
return new Promise(function (resolve) {
(function runItem() {
var item = getNext();
if (item == null) {
resolve();
} else {
func(item).then(runItem, runItem);
}
})();
});
}
// использование
// функция, которая что-то делает асинхронно
var func = function(a) {
var w = this;
console.log('worker ' + w + ': start ' + a);
return new Promise(function(r) {
setTimeout(function() { console.log('worker ' + w + ': end ', a); r(); }, a * 1000);
});
};
// очередь параметров
var data = [4, 3, 8, 2, 5, 6, 12];
var getNext = data.shift.bind(data);
console.log('queue: ' + data.join(' '));
// два параллельных потока
Promise.all([
runWorker(func.bind(0), getNext),
runWorker(func.bind(1), getNext)
]).then(console.log.bind(console, 'end all'));
если это выполнить с открытой консолью, то можно увидеть, каким работником какой пункт обрабатывается. "Свободная касса!" и всё такое