Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.10.2023, 03:47
Новичок на форуме
Отправить личное сообщение для AquaMen Посмотреть профиль Найти все сообщения от AquaMen
 
Регистрация: 14.10.2023
Сообщений: 1

Не понимаю как работает setTimeout в коде
Есть код:
function openURLs() {
  for (let i = 10045; i <= 10100; i++) {
    const url = `https://www.example.com/create/${i}/`;
    setTimeout(() => {
      try {
        const xhr = new XMLHttpRequest();
        xhr.open('POST', url, true);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.withCredentials = true;

      // Добавляем заголовки
      xhr.setRequestHeader('authority', 'www.example.com');
      xhr.setRequestHeader('method', 'POST');
      xhr.setRequestHeader('path', `/create/${i}/`);
      xhr.setRequestHeader('scheme', 'https');
      xhr.setRequestHeader('accept', '*/*');
      xhr.setRequestHeader('accept-language', 'en-US,en;q=0.9');
      xhr.setRequestHeader('dpr', '1');
      xhr.setRequestHeader('viewport-width', '814');
      xhr.setRequestHeader('x-asbd-id', '129477');
      xhr.setRequestHeader('x-csrftoken', 'token');
      xhr.setRequestHeader('x-ig-app-id', 'id');
      xhr.setRequestHeader('x-ig-www-claim', 'wwwclaim');
      xhr.setRequestHeader('x-________-ajax', 'id');
      xhr.setRequestHeader('x-kl-ajax-request', 'Ajax_Request');
      xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');

      xhr.onload = function () {
          if (xhr.status === 200) {
            const contentType = xhr.getResponseHeader('content-type');
            if (contentType && contentType.includes('application/json')) {
              const data = JSON.parse(xhr.responseText);
              console.log(`Открыт URL ${url}:`, data);
              // Дальнейшая обработка данных
            } else {
              throw new Error('Некорректный формат ответа');
            }
          } else {
            throw new Error('Ошибка выполнения запроса');
          }
        };

        xhr.onerror = function () {
          console.error(`Ошибка выполнения запроса для URL ${url}:`, xhr.statusText);
          // Обработка ошибок
        };

        const params = new URLSearchParams();
        params.append('container_module', 'single_post');

        xhr.send(params);
      } catch (error) {
        console.error(`Ошибка выполнения запроса для URL ${url}:`, error);
        // Обработка ошибок
      }
    }, i * 1000);
  }
}

openURLs();


Мне нужен таймаут между запросами - секунда. Код выполняю в консоли браузера, на странице сайта, а результат смотрю в колонке "Сеть". И сначала проходит много времени, очень похоже на "количество запросов*таймаут" а потом в инструментах разраба резко появляется куча запросов. Почему?
Ответить с цитированием
  #2 (permalink)  
Старый 14.10.2023, 04:07
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

Сообщение от AquaMen
сначала проходит много времени,
Сообщение от AquaMen
}, i * 1000);
Сообщение от AquaMen
Мне нужен таймаут между запросами - секунда.
}, (i - 10045)* 1000);
Ответить с цитированием
  #3 (permalink)  
Старый 14.10.2023, 04:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,504

AquaMen, даже если бы это работало - так делать не надо, timeout ничего не гарантирует(по точности времени) и через десяток запросов пойдёт полный расколбас, не говоря уже о занимаемой памяти на ожидание запуска всех этих запросов сразу.

На современном js этот код можно написать весьма наглядно и по-порядку:
function request(url, i) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open('POST', url, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.withCredentials = true;

    // Добавляем заголовки
    xhr.setRequestHeader('authority', 'www.example.com');
    xhr.setRequestHeader('method', 'POST');
    xhr.setRequestHeader('path', `/create/${i}/`);
    xhr.setRequestHeader('scheme', 'https');
    xhr.setRequestHeader('accept', '*/*');
    xhr.setRequestHeader('accept-language', 'en-US,en;q=0.9');
    xhr.setRequestHeader('dpr', '1');
    xhr.setRequestHeader('viewport-width', '814');
    xhr.setRequestHeader('x-asbd-id', '129477');
    xhr.setRequestHeader('x-csrftoken', 'token');
    xhr.setRequestHeader('x-ig-app-id', 'id');
    xhr.setRequestHeader('x-ig-www-claim', 'wwwclaim');
    xhr.setRequestHeader('x-________-ajax', 'id');
    xhr.setRequestHeader('x-kl-ajax-request', 'Ajax_Request');
    xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');

    xhr.onload = function () {
      if (xhr.status === 200) {
        const contentType = xhr.getResponseHeader('content-type');
        if (contentType && contentType.includes('application/json')) {
          const data = JSON.parse(xhr.responseText);
          console.log(`Открыт URL ${url}:`, data);
          resolve(data);
        } else {
          reject(new Error('Некорректный формат ответа'));
        }
      } else {
        reject(new Error('Ошибка выполнения запроса'));
      }
    };

    xhr.onerror = reject;

    const params = new URLSearchParams();
    params.append('container_module', 'single_post');

    xhr.send(params);
  });
}

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function openURLs() {
  for (let i = 10045; i <= 10100; i++) {
    try {
      const url = `https://www.example.com/create/${i}/`;
      await delay(1000);
      const data = await request(url, i);
      // Дальнейшая обработка данных
    } catch (error) {
      console.error(`Ошибка выполнения запроса для URL ${url}:`, error);
      // Обработка ошибок
    }
  }
}

openURLs();


P.S. try catch у тебя толком ничего не ловят, т.к. все ошибки кидаются в отдельных функциях которе вызывается асинхронно в не рамок блока текущего кода.
__________________
29375, 35

Последний раз редактировалось Aetae, 14.10.2023 в 04:44.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
python как это работает 6at9l Серверные языки и технологии 6 27.06.2018 21:02
Как работает [' '] конструкция Trif Node.JS 2 14.06.2017 15:27
Как работает подсветка синтаксиса? Hapson Events/DOM/Window 13 08.01.2014 20:07
Как работает Google Analytics: смотрю в "Инструментах разработчика" Chrome hrundel Общие вопросы Javascript 0 10.10.2013 19:31
Индексация AJAX сайтов - Как это работает? byFahrenheit AJAX и COMET 4 21.02.2013 17:09