Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 01.09.2021, 12:39
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,703

Конечно можно считать, что в гуглах сидят программеры, которые от избытка денег и времени делают никому не нужные оптимизации.
Сообщение от Aetae
Конечно же никакого spread и destructuring.
Вроде утверждается, что это неплохо оптимизированно, касаемо массивов.
Ответить с цитированием
  #22 (permalink)  
Старый 01.09.2021, 12:48
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

voraa, неплохо. Но всё равно в 100500 раз больше времени занимает, чем потенциальные расходы от дырок.)
По твоей же ссылке прямо пишут "the performance difference between accessing holey or packed arrays is usually too small to matter or even be measurable".
__________________
29375, 35
Ответить с цитированием
  #23 (permalink)  
Старый 01.09.2021, 13:57
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от dc65k
const sendRequests = (requests, maxRequestsCount) => {
У такого подхода есть баг: если мы отправим 2 порции запросов, то они пойдут параллельно, т.е. будет в два раза больше запросов одновременно - у них ведь 2 независимые очереди.
Запилил исправленную версию, которая позволяет отправлять несколько порций. Причем, вторая порция может начать исполняться ещё до того, как завершится первая.
function createSendRequests(func, limit) {
    let reqCount = 0;
    const queue = [];
    return function (requests) {
        console.log('sendRequests for ', requests.join(','));
        if (!requests || !requests.length) {
            return Promise.resolve([]);
        }
        return new Promise((resolve) => {
            const responses = Array.from({length: requests.length});
            let curUrlInd = 0;
            let requestDone = 0;

            while (curUrlInd < requests.length && reqCount < limit) {
                makeRequest(curUrlInd);
            }

            let inQueue = curUrlInd < requests.length;
            if (inQueue) {
                queue.push(nextRequest);
            }

            function nextRequest() {
                makeRequest(curUrlInd);
                if (inQueue && curUrlInd === requests.length) {
                    inQueue = false;
                    queue.shift();
                }
            }

            function makeRequest(n) {
                reqCount++;
                curUrlInd++;
                const req = requests[n];
                console.log('request for ', req);
                func(req).then(data => {
                    console.log('response for ', req);
                    responses[n] = {
                        data
                    };
                }, (err) => {
                    responses[n] = {
                        error: err || 'error'
                    };
                }).finally (() => {
                    reqCount--;
                    if (queue.length) {
                        queue[0]();
                    }
                    requestDone++;
                    if (requestDone === requests.length) {
                        resolve(responses);
                    }
                });
            }
        });
    };
}

// ----- использование -------------------------------------

function myFetch(req) {
    return new Promise((res) => {
        setTimeout(res, 1000, 'response for ' + req);
    });
}

var sendRequests = createSendRequests(myFetch, 5);

sendRequests([
    'reqA',
    'reqB',
]).then((data) => {
    console.log('responses 1', data);
});

sendRequests([
    'req1',
    'req2',
    'req3',
    'req4',
    'req5',
    'req6',
    'req7',
]).then((data) => {
    console.log('responses 2', data);
});

sendRequests([
    'req8',
    'req9',
    'req10',
    'req11',
    'req12',
]).then((data) => {
    console.log('responses 3', data);
});
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как реализовать отправку содержимого из iframe нажатием комбинации клавиш ctrl+enter Naizer Общие вопросы Javascript 4 27.11.2013 17:39
Подскажите как реализовать такую задачу Gasherez (X)HTML/CSS 0 20.09.2013 19:59
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как это реализовать на JS Bezlyj Общие вопросы Javascript 6 06.03.2012 09:20
Как реализовать? Fliand Элементы интерфейса 4 22.08.2009 19:47