параметр "true" в методе xmlHttpRequest .open () - PullRequest
26 голосов
/ 24 июня 2011

Из ссылки, которую я прочитал в MDN, написано

Если TRUE (по умолчанию), выполнение функции JavaScript будет продолжаться, пока ответ сервера еще не поступил.

Это A в AJAX.

Я использовал AJAX, но потом я немного растерялся, когда прочитал это. Я думаю, что проблема может быть в том, что я не совсем понимаю концепцию AJAX. Я знаю, конечно, что AJAX не обновляет страницу, а это означает, что соединение с сервером и ответ полностью выполняются в фоновом режиме.

Но то, что я могу себе представить, происходит по этой ссылке: если у меня есть такой код в моем JavaScript:

//true, therefore process the function while server retrieves url
var xmlResponse;
var url = "http://example.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 может быть неопределенным в том смысле, что сервер все еще получает данные? Может ли кто-нибудь объяснить, каков на самом деле поток выполнения в технологии AJAX? Заранее спасибо.

Ответы [ 2 ]

23 голосов
/ 24 июня 2011

Я написал более подробную статью здесь , но это основная идея.

Значение true означает, что вы делаете асинхронный запрос. Это означает, что код не приостанавливается до тех пор, пока http-запрос не будет выполнен. Синхронный вызов блокирует браузер, поэтому больше ничего не запускается. Это может вызвать проблемы, поэтому люди предпочитают асинхронные.

Объект XHR информирует нас о том, что он делает. Это дает нам обновления с событием onreadystatechange. Мы регистрируем функцию, чтобы отслеживать ее статус. Onreadystatechange вызывается 4 раза. Каждый с другим состоянием

0 = uninitialized
1 = loading
2 = loaded
3 = interactive
4 = complete

Данные доступны нам, когда состояние готовности равно 4.

Теперь в коде, который вы разместили, он проверяет полное состояние и проверяет, что статус равен 200 [ok]

if(xml_req.readyState == 4 && xml_req.status == 200){

Значение для xmlResponse будет неопределенным, если вы попытаетесь использовать его где-то еще в коде, прежде чем оно будет возвращено. Пример

ml_req.send(null);
alert(xmlResponse );

Одной из самых первых статей в статье XMLHttpRequest может быть хорошее чтение для вас. Статья Apple на xmlhttpreq

4 голосов
/ 24 июня 2011

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

...