Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax, не понимаю значение одной строки в коде 
:(
    Опции темы
zenerru
Дата 1.10.2010, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



Код


HTTP._factories = [
    function() { return new XMLHttpRequest(); },
    function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
    function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];

HTTP._factory = null;

HTTP.newRequest = function() {
    if (HTTP._factory != null) return HTTP._factory();

    for(var i = 0; i < HTTP._factories.length; i++) {
        try {
            var factory = HTTP._factories[i];
            var request = factory();
            if (request != null) {
                HTTP._factory = factory;
                return request;
            }
        }
        catch(e) {
            continue;
        }
    }

    HTTP._factory = function() {
        throw new Error("XMLHttpRequest not supported");
    }
    HTTP._factory(); // Throw an error
}



Для чего возвращается значение request ?  "return request;" Без это строки, что пойдет не так ?
PM MAIL   Вверх
Amphiluke
Дата 2.10.2010, 05:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



А как по-вашему, для чего служит метод newRequest?  smile Он создает объект XMLHttpRequest и возвращает этот объект для дальнейших действий по формированию и отправке AJAX-запроса. А иначе зачем вообще был бы нужен метод newRequest?
PM   Вверх
zenerru
Дата 2.10.2010, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



т.е. это ключевая строка, тогда для чего HTTP._factory = factory; просто запомнить значение и все ? зачем тогда создавалась переменная HTTP._factory = null; Чет я туплю, простите.


Хотя ща попытаюсь воспроизвести алгоритм. По чуть чуть доходит. )))

Это сообщение отредактировал(а) zenerru - 2.10.2010, 08:08
PM MAIL   Вверх
Amphiluke
Дата 2.10.2010, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Этот метод (newRequest) при первом вызове перебирает (в цикле по массиву _factories) всевозможные способы создания объекта XMLHttpRequest, поскольку в разных браузерах подходы к созданию различны.
Как только метод нашел нужный для текущего браузера конструктор объекта XMLHttpRequest, он, условно говоря, запоминает его в свойстве _factory, чтобы при следующем вызове не повторять опять работу с перебором возможных способов, а сразу вызвать нужный конструктор через функцию, ранее записаную в свойство _factory.

Это сообщение отредактировал(а) Amphiluke - 2.10.2010, 08:17
PM   Вверх
zenerru
Дата 2.10.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



парни, спасибо всем
PM MAIL   Вверх
zenerru
Дата 3.10.2010, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



парни, а для чего вообще вводить переменную request. нельзя ли просто обойтись  factory, и для проверки условия, и для присвоения переменной HTTP._factory, и для return
PM MAIL   Вверх
Amphiluke
Дата 3.10.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



zenerru, вы для начала лучше почитайте чего-нибудь по AJAX'у. Переменная request совершенно необходима для осуществления запросов, поскольку именно эта переменная ссылается на объект XMLHttpRequest, который располагает методами open, send и другими, свойствами readyState, responseText/responseXML и т. д., т.е. всеми необходимыми атрибутами для успешной отправки запроса и получения ответа от сервера.

А вот атрибут HTTP._factory как раз не так важен. Это всего лишь ссылка на функцию, вызывающую конструктор объекта XMLHttpRequest. Обычно обхоятся без нее, всякий раз перебирая всевозможные конструкторы, а тут уж автор кода решил для большей грамотности запомнить нужный конструктор, чтобы не искать его потом.

Добавлено через 9 минут и 15 секунд
А, прошу прощения, кажется, я немного не понял ваш вопрос.
Вы имеете в виду, что введение переменной request ведет избыточности кода, когда уже имеется переменная factory? Не. Переменная factory только ссылается на функцию, которая вызывает нужный конструктор, но результат вызова конструктора (т.е. объект XMLHttpRequest) она не хранит. Переменная request как раз нужна, чтобы хранить результат, возвращенный конструктором, т.е. сам объект XMLHttpRequest.

Это сообщение отредактировал(а) Amphiluke - 3.10.2010, 14:32
PM   Вверх
zenerru
Дата 4.10.2010, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



понял, спасибо большое )
PM MAIL   Вверх
zenerru
Дата 4.10.2010, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



я думаю, это последнее уточнение. Но получается так. Если HTTP._factory не пуст. Вызывается нужный конструктор (объект). А где в это время request ? ведь этот код уже не выполняется.

Код

for(var i = 0; i < HTTP._factories.length; i++) {
        try {
            var factory = HTTP._factories[i];
            var request = factory();
            if (request != null) {
                HTTP._factory = factory;
                return request;
            }
        }


Я просто не понимаю, что происходит после вызова return HTTP._factory(); эта функция хранит ссылку на нужный конструктор. Конструктор выполняется и сам возвращает request ? в общем я правильно понимаю, что return request; выполняется один раз, пока не определена переменная HTTP._factory(); ? А дальше что с ней происходит-то. Блин, я в общем туплю. Даже не понимаю как правильно код разбирать, чтобы по полочкам все разобрать (((
PM MAIL   Вверх
zenerru
Дата 4.10.2010, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



спасибо еще раз, я разобрался полностью, разобрал готовые примеры и понял что к чему.
PM MAIL   Вверх
zenerru
Дата 4.10.2010, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 15.12.2009

Репутация: нет
Всего: нет



Я вот не знаю, правильно ли я понял, эти 2 строчки равносильны ? return HTTP._factory(); и return request;
PM MAIL   Вверх
Amphiluke
Дата 4.10.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Цитата(zenerru @  4.10.2010,  14:30 Найти цитируемый пост)
Я вот не знаю, правильно ли я понял, эти 2 строчки равносильны ? return HTTP._factory(); и return request;

Да, суть одна.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.