Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Не понимаю как работает setTimeout в коде (https://javascript.ru/forum/misc/85549-ne-ponimayu-kak-rabotaet-settimeout-v-kode.html)

AquaMen 14.10.2023 03:47

Не понимаю как работает 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();


Мне нужен таймаут между запросами - секунда. Код выполняю в консоли браузера, на странице сайта, а результат смотрю в колонке "Сеть". И сначала проходит много времени, очень похоже на "количество запросов*таймаут" а потом в инструментах разраба резко появляется куча запросов. Почему?

рони 14.10.2023 04:07

Цитата:

Сообщение от AquaMen
сначала проходит много времени,

Цитата:

Сообщение от AquaMen
}, i * 1000);

Цитата:

Сообщение от AquaMen
Мне нужен таймаут между запросами - секунда.

}, (i - 10045)* 1000);

Aetae 14.10.2023 04:39

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 у тебя толком ничего не ловят, т.к. все ошибки кидаются в отдельных функциях которе вызывается асинхронно в не рамок блока текущего кода.


Часовой пояс GMT +3, время: 00:01.