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);
Ссылки: