Подтвердить что ты не робот

Параметр "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? Спасибо заранее.

4b9b3361

Ответ 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. Каждый раз мы проверяем, полностью ли получен ответ, и только потом мы продолжаем обрабатывать этот ответ.