Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.08.2019, 15:49
Аватар для b5414
Новичок на форуме
Отправить личное сообщение для b5414 Посмотреть профиль Найти все сообщения от b5414
 
Регистрация: 30.06.2019
Сообщений: 3

Выполнение N async параллельных скриптов, с лимитом и ожиданием их выполнения
Всем привет, не могу решить задачу, nodejs, сижу 3 день... Задача сложна, и мне слов не хватает описать её, связи с этим представляю несколько описаний

Суть задачи:
Нужно запустить asd - N раз, параллельно и с лимитом.
Если одна из N завершилась, смотреть лимит, запускать asd до лимита опять. Ждать ответ из asd, добавлять его в пелеменную... и вся эта махинация до окончания массива который передается в asd.

:
const Asd=async(a)=>{
	let b = await some(a);
	return b;
};


Или так, НО без await на 14 строке, а т.е. параллельное выполнение и ожидания ответов так же параллельно от каждой, исполнение до конца массива с лимитом в 4(например)
const asd=async(a)=>{
	return a*2;
};

const main=async()=>{
	let URL = [1,2,3,4,5];
	let x = [];
	let k = 0;
	let limit = 4;
	
	while(URL.length > 0){
		while(k < limit && URL.length > 0){
			k++;
			let g = await asd(URL.shift()).then((r)=>{
				k--;
				return r;
			});
			x.push(g.toString());
		}
	}
	
	return x;
};

const a=async()=>{
	let x = await main();
	console.log(x);
};
a();


Или так: Нужно открыть браузер, открыть в нем 4 вкладки из массива ЮРЛ, как только работа в одной из вкладок проделана(из asd return b) и вкладка закрылась, если ЮРЛ.length > 0 запускать еще вкладку до лимита 4

Или так: Есть работающий код, который запускает asd(в котором парсится страница, он асинхронен и в нём присутствует await), код ожидает ответа от asd, затем запускает asd заново, покуда URL лист не иссякнет, после окончания массива выдает общий результат asd(часть всех страниц). Дак вот, как запускать asd параллельно N раз, с лимитом N в K(4 asd максимум)
Ответить с цитированием
  #2 (permalink)  
Старый 27.08.2019, 09:42
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

см. в консольку

function run(limit, func, params) {
    'use strict';
    if (typeof limit !== 'number' || limit < 1 || typeof func !== 'function' || !params || !params.length) {
        return Promise.resolve([]);
    }

    return new Promise(function (resolve) {
        var result = new Array(params.length);
        var pos = 0;
        var rcount = 0;
        function ok(data) {
            end(this, false, data);
        }
        function err(data) {
            end(this, true, data);
        }
        function end(idx, error, data) {
            result[idx] = {
                data: error ? null : data,
                error: error ? data : null
            };
            rcount++;
            if (pos < params.length) {
                Promise.resolve(func(params[pos])).then(ok.bind(pos), err.bind(pos));
                ++pos;
            } else {
                if (rcount >= params.length) {
                    resolve(result);
                }
            }
        }
        var m = Math.min(limit, params.length);
        while (pos < m) {
            Promise.resolve(func(params[pos])).then(ok.bind(pos), err.bind(pos));
            ++pos;
        }
    });
}


run(3, function(p) {
    console.log('start: ', p);
    return new Promise(function(r) { setTimeout(function(v) { console.log(v); r(v); }, p * 1000, 'result ' + p); });
}, [5, 3, 7, 2, 6]).then(console.log);
Ответить с цитированием
  #3 (permalink)  
Старый 27.08.2019, 11:37
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

Велосипеды кругом )
https://github.com/sindresorhus/p-limit
https://github.com/sindresorhus/p-queue
Ответить с цитированием
  #4 (permalink)  
Старый 27.08.2019, 19:37
Аватар для b5414
Новичок на форуме
Отправить личное сообщение для b5414 Посмотреть профиль Найти все сообщения от b5414
 
Регистрация: 30.06.2019
Сообщений: 3

Сообщение от SuperZen Посмотреть сообщение
https://github.com/sindresorhus/p-limit
https://github.com/sindresorhus/p-queue
Пушечка, спасибо, это то что нужно <3

Последний раз редактировалось b5414, 15.06.2020 в 04:29.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отключить выполнение скриптов в тегах <script> внутри контейнера <iframe> maysoul Events/DOM/Window 6 16.08.2017 13:37
Выполнение скриптов в AJAX Mikhail1989 jQuery 3 31.07.2015 04:21
распарсить строку json sotik AJAX и COMET 14 24.11.2014 16:06
Выполнить скрипт после выполнения остальных скриптов страницы alexandre0sheva Events/DOM/Window 6 26.02.2014 15:29
Выполнение скриптов в ColorBox oskolsky AJAX и COMET 4 19.12.2011 06:09