Показать сообщение отдельно
  #11 (permalink)  
Старый 01.07.2018, 09:50
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

В 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'));


если это выполнить с открытой консолью, то можно увидеть, каким работником какой пункт обрабатывается. "Свободная касса!" и всё такое
Ответить с цитированием