Параметр "true" в методе xmlHttpRequest.open()
Из ссылки, которую я прочитал в MDN, говорится
If TRUE (the default), the execution of the JavaScript
function will continue while the response of the server has not yet arrived.
This is the A in AJAX.
Я использую AJAX, но потом я немного смутился, когда прочитал это. Я думаю, проблема может заключаться в том, что я не понимаю концепцию AJAX. Я знаю, конечно, что AJAX не обновляет страницу, что означает подключение к серверу, и ответ полностью выполнен в фоновом режиме.
Но то, что я могу себе представить, происходит по этой ссылке: если у меня есть такой код в моем JavaScript:
//true, therefore process the function while server retrieves url
var xmlResponse;
var url = "http://domain.com/file.xml";
xml_req.open("GET", url, true);
xml_req.onreadystatechange = function() {
if(xml_req.readyState == 4 && xml_req.status == 200) {
if(xml_req.responseText != null)
xmlResponse = xml_req.responseXML; //server response may not yet arrive
else {
alert("failed");
return false;
}
};
xml_req.send(null);
Разве это не означает, что xmlResponse может быть undefined в том смысле, что сервер все еще извлекает данные? Может ли кто-нибудь объяснить, что на самом деле является потоком исполнения в технологии AJAX? Спасибо заранее.
Ответы
Ответ 1
Я написал более подробную статью здесь, но это основная идея.
Установка значения true означает, что вы выполняете асинхронный запрос. Это означает, что код не приостанавливается до завершения HTTP-запроса. Синхронный вызов блокирует браузер, и ничего больше не запускается. Это может вызвать проблемы, поэтому люди предпочитают асинхронно.
Объект XHR обновляет нас по тому, что он делает. Он дает нам обновления с событием onreadystatechange. Мы регистрируем функцию с ней, чтобы мы могли отслеживать ее статус. Onreadystatechange называется 4 раза. Каждый с другим состоянием
0 = uninitialized
1 = loading
2 = loaded
3 = interactive
4 = complete
Данные доступны нам, когда readistate равен 4.
Теперь в коде, который вы отправили, он проверяет полное состояние и гарантирует, что статус 200 [ok]
if(xml_req.readyState == 4 && xml_req.status == 200){
Значение для xmlResponse будет undefined, если вы попытаетесь использовать его где-то еще в коде перед его возвратом. Пример
ml_req.send(null);
alert(xmlResponse );
Одна из первых статей в статье XMLHttpRequest может быть хорошо прочитана для вас. Статья Apple на xmlhttpreq
Ответ 2
Важно понять, что ваш обработчик onreadystatechange
не выполняется немедленно. И это выполняется не один раз. Это может быть проще концептуализировать, если вы разбиваете части на отдельные функции:
function makeRequest(url)
{
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onreadystatechange = receiveResponse;
xhr.send();
}
function receiveResponse(e)
{
if (this.readyState == 4)
{
// xhr.readyState == 4, so we've received the complete server response
if (this.status == 200)
{
// xhr.status == 200, so the response is good
var response = this.responseXML;
...
}
}
}
Сначала вызывается makeRequest
, а затем завершается. Затем, как только мы услышим что-нибудь с сервера, вызывается receiveResponse
. Каждый раз мы проверяем, полностью ли получен ответ, и только потом мы продолжаем обрабатывать этот ответ.