JavaScript XMLHttprequests - PullRequest
       3

JavaScript XMLHttprequests

1 голос
/ 23 марта 2011

Я получил этот пример, демонстрирующий AJAX от Стояна Стефанова Объектно-ориентированный JavaScript на стр. 275. В этом примере он запрашивает три разных файла.У меня есть пара вопросов, если кто-нибудь из вас может помочь.

  1. Что делает xhr.send('')?Зачем нам это нужно?Я думал, GET в строке, прежде чем установить связь с сервером, так почему это отправить?
    (Другие вопросы касаются закрытия, которое я не совсем понимаю ...)

  2. что именно передается в качестве параметра в function(myxhr)?

  3. относительно анонимной функции, которая (xhr) передана в качестве параметра, можетВы объясните, в какой момент в программе xhr передается анонимной функции?Например, это после xhr.open?

  4. Почему необходима функция (myxhr)?Если это необходимо для создания замыкания, зачем здесь замыкание?

  5. - это параметр (xhr) анонимной функции, передаваемой как параметр myxhr в function(myxhr) один раз анонимной функциейвызывается?

  6. , если 5 истинно - что xhr передается как параметр в function(myxhr) - почему необходимо изменить имя параметра с xhr наmyxhr?

Код образца:

function request(url, callback){
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = (function(myxhr){
    return function() {
      callback(myxhr);
    }
  })(xhr);
  xhr.open('GET', url, true);
  xhr.send('');
}

request (
  'http://www.phpied.com/files/jsoop/content.txt',
  function (o){
    document.getElementById('text').innerHTML = o.responseText;
  }
);

request(
  'http://www.phpied.com/files/jsoop/content.html',
  function(o) {
    document.getElementById('html').innerHTML = o.responseText;
  }
);

request(
  'http://www.phpied.com/files/jsoop/content.xml',
  function(o){
    document.getElementById('xml').innerHTML =
    o.responseXML.getElementsByTagName('root')[0].firstChild.nodeValue;
  }
);

Ответы [ 3 ]

2 голосов
/ 23 марта 2011

Что делает xhr.send ('')?Зачем нам это нужно?Я думал, GET в строке, прежде чем установить связь с сервером, так почему это отправить?(Другие вопросы касаются закрытия, которое я не совсем понимаю ...)

Open только устанавливает запрос.Отправить на самом деле отправляет его.Когда вы делаете запрос POST, вам нужно передать для отправки.

что именно передается в качестве параметра для функции (myxhr)?

Содержимоепеременная xhr.

, относящаяся к анонимной функции, в которой (xhr) передан в качестве параметра, можете ли вы объяснить, в какой момент программы xhr передается анонимной функции?Например, происходит ли это после xhr.open?

Как только вызывается функция (за которой сразу следует определение ()).

зачем нужна функция (myxhr)?Если это создает замыкание, зачем здесь замыкание?

Это не так.Даже если переменная xhr не была локально ограничена функцией request (что она есть), к ней можно получить доступ через this.

- параметр (xhr) анонимногоФункция передается как параметр myxhr в функцию (myxhr) после вызова анонимной функции?

Да.

если 5 истинно - этот xhr передается в качестве параметра функции (myxhr) - почему необходимо изменить имя параметра с xhr на myxhr?

Это не так.Вы можете повторно использовать имя переменной в разных областях.Это делает его менее запутанным.

1 голос
/ 23 марта 2011

1 - Что делает xhr.send('')?

Отправляет запрос на сервер. До вызова send() сетевая активность не происходит.

1.a - Зачем нам это нужно? Я думал, GET в линии, прежде чем устанавливать контакт с сервером, так почему это отправить?

Потому что open() не связывается с сервером. Он просто готовит объект запроса.

2 - что именно передается как параметр в function(myxhr)?

Объект xhr передается этой функции.

(function(myxhr){ /* ... */ })(xhr);
//-----------------------------^^^
//  define the function...    | ...and call it immediately

3 - в отношении анонимной функции, для которой (xhr) передан в качестве параметра, можете ли вы объяснить, в какой момент программы xhr передается анонимной функции? Например, это после xhr.open?

Это немедленно передается. function(myxhr) не имеет никакой другой цели в жизни, кроме конструирования и возврата своего результата (который просто оказывается другой функцией), поэтому все его время жизни - это единственный оператор, в котором он определяется и вызывается немедленно.

4 - зачем нужна функция (myxhr)? Если нужно создать замыкание, зачем здесь замыкание?

На самом деле, дополнительное закрытие не требуется. Это лишнее. Это эквивалентно (и это также создает замыкание):

function request(url, callback){
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = (function() {
      callback(xhr);
  });
  xhr.open('GET', url, true);
  xhr.send('');
}

Закрытие необходимо, чтобы у функции обратного вызова, зарегистрированной в событии readystatechange, был некоторый контекст для запуска. Закрытие всегда создается автоматически всякий раз, когда определяется функция. Он сохраняет переменные, которые находились в области действия во время определения функции: приведенное выше сохраняет значение xhr и callbackurl тоже!) Во внутренней функции, даже если это неясно когда будет выполняться функция обратного вызова.

5 - является ли параметр (xhr) анонимной функции переданным в качестве параметра myxhr в function(myxhr) после вызова анонимной функции?

Да, она передается, когда вызывается анонимная «внешняя» функция (см. 3).

6 - если 5 истинно - что xhr передается в качестве параметра функции (myxhr) - почему необходимо изменить имя параметра с xhr на myxhr?

Это не обязательно, но менее запутанно, чем везде использовать одно и то же имя переменной. Сравните:

var f = (function(i) {
  /* outer scope i = 4 */
  return (function(i) {
    /* inner scope i = 8 */
    return i;
  })(i + 4);
})(4);

// now f is 8

Однако, если вы хотите использовать "external" i во "внутренней" функции, вам придется использовать что-то другое, чем i, в качестве имени параметра для внутренней функции.

1 голос
/ 23 марта 2011

Полезным ресурсом для понимания этого является Объект XMLHHTPRequest из MSDN и Использование XMLHTTPReuqestobject , но для краткости я постараюсь в ближайшее время ответить на ваши вопросы.xhr.send ();отправляет запрос к URL-адресу с помощью метода Open.

Объект XMLHTTPRequest передается в качестве параметра функции function(myxhr) «xhr» передается функции, когда состояние запроса изменяется после некоторого ответаПолучено. «myxhr» - это только имя параметра, который вы можете изменить по своему желанию, но переданный объект имеет тип XMLHttpResponse. Да В этом нет необходимостина все.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...