L oop HTTP-запрос на страницу, пока код состояния не станет 200, а затем перенаправить на эту страницу - PullRequest
0 голосов
/ 24 апреля 2020

Я новичок ie на js, поэтому мне нужен хороший совет, как эту задачу можно решить. На мой взгляд, это может выглядеть так, но это определенно не работает правильно:

    while (status !== 200) { checkPage(); }
    function checkPage() {
        var xhr = new XMLHttpRequest(),
            method = "GET",
            url = link;
        xhr.open(method, url, true);
        xhr.onreadystatechange = function () {
            if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
                status = xhr.status;
                return true;
            }
        }
        xhr.send();
    }

1 Ответ

0 голосов
/ 24 апреля 2020

XMLHttpRequest по умолчанию асинхронный (и хорошая практика, так как синхронный вызов блокирует браузер). Поэтому ответ от XMLHttpRequest.send() должен обрабатываться асинхронно.

Вызовы асинхронной функции традиционно обрабатываются с помощью функции обратного вызова с использованием шаблона, подобного следующему:

function myCallback (response) {
  console.log('response from async function:', response);
}

function callAsyncFunction (myCallback) {
  const async = new AsyncFunction();

  async.oncompletion = function (response) {
    myCallback(response);
}

Используя этот шаблон, checkPage() функция может быть переписана для использования функции обратного вызова, когда она получает желаемый код ответа 200:

// callback to receive the 200 response
function handle200 (response) {
  console.log('handle200 has received:', response);
}

function checkPage(callback) {
  const xhr = new XMLHttpRequest(),
    method = "GET",
    url = "http://your-target-url-here";

  // initialize a new GET request
  xhr.open(method, url, true);

  // respond to every readyState change
  xhr.onreadystatechange = function () {

    // ignore all readyStates other than "DONE"
    if (xhr.readyState !== XMLHttpRequest.DONE) { return; }

    // call the callback with status
    if (xhr.status === 200) {
      return callback(xhr.status);
    }

    // got something other than 200,
    // re-initialize and send another GET request
    xhr.open(method, url, true);
    xhr.send();
  }

  // send the initial GET request
  xhr.send();
}

// call checkPage once
checkPage(handle200);

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...