Использование XMLHttpRequest.readyState вне обработчиков

MDN предлагает отслеживать загрузку XMLHttpRequest через события (progress, load, error и др.), в том числе через событие onreadystatechange, возникающее при изменении поля readyState.

Таким образом в обработчике onreadystatechange можно прочитать поле readyState и определить дальнейшие действия в зависимости от его значения.

Вопрос — можно ли использовать это поле (readyState) вне обработчиков событий XMLHttpRequest, например по таймеру или в обработчике клика мышки. Будет ли состояние этого поля в этом случае актуально? Или актуальность гарантируется только внутри вызовов обработчиков XMLHttpRequest?

Update

Такой же вопрос и касательно поля status (который показывает статус ответа на запрос, такой как 200, 404 и т.п.), если, к примеру, его значение равно 404 вне обработчиков событий XMLHttpRequest, можно ли это трактовать как неуспешный запрос?


Ответы (2 шт):

Автор решения: DiD

Конечно, можно.

const xhr = new XMLHttpRequest(),
    method = "GET",
    url = "https://ru.stackoverflow.com/topbar/inbox?_="+Date.now();

let readyState = null, status = null;

xhr.open(method, url, true);
xhr.onreadystatechange = function () {
  // In local files, status is 0 upon success in Mozilla Firefox
  readyState = xhr.readyState;
   console.log('readyState', readyState);
  if(readyState === XMLHttpRequest.DONE) {
    status = xhr.status;
  }
};

let interval = setInterval(()=>{
  if(readyState){
    clearInterval(interval);
    console.log('status', status);
    console.log('data', xhr.responseText);
  }
}, 50);

xhr.send();

→ Ссылка
Автор решения: Grundy

Данные поля расположены в объекте XMLHttpRequest, следовательно, обращаться к ним можно отовсюду, где доступен конкретный объект, в данном случае xhr.

Обработчики событий просто позволяют поймать конкретный момент, в который меняются значения полей.

→ Ссылка