Ajax и асинхронный запрос

Духовность™

Продвинутый новичок
Ajax и асинхронный запрос

Решил написать класс для аякса. Всё бы ничего, да только "влип" на асинхронном запросе:

PHP:
this.get = function(url, request)
{
    req.open('GET', url, true); 
    req.onreadystatechange = function()
    {
        if (req.readyState == 4)
        {
            if (req.status == 200)
            {
                 // вот В ЭТОМ МЕСТЕ (и нигде более) надо что-то делать с req
                 myfunction(req.responseText); // получаем текст ответа и что-то с ним делаем
            }
        }
    }
    req.send(request);
}
как видно из кода, сложность заключается в том, что обработчик результата req надо вставлять непосредственно в тело onreadystatechange!

Мне очень не нравится этот вариант тем, что при любой нужде использовать асинхронный запрос придется писать точно такой же метод, только вместо myfunction(req); будет myfunction2(req); и т.д. Т.е. тело метода get будет плодиться с небольшими изменениями.

Я прав? Другого выхода нет?
 

x-yuri

Новичок
можно передать функцию в качестве параметра методу get (функции в js - тип данных, имя функции - ссылка на нее)

еще можно вызвать функции в контексте объекта req:
Код:
myfunction.call(req)
тогда в функции можно будет обращаться к полям объекта req через this

p.s. ссылка по теме - http://xmlhttprequest.ru/

p.p.s. this.get: если ты таким образом добавляешь метод к объекту, то это не лучший вариант. У каждого объекта будет свой экземпляр метода. Лучше добавлять методы к прототипу
 

Духовность™

Продвинутый новичок
если ты таким образом добавляешь метод к объекту, то это не лучший вариант. У каждого объекта будет свой экземпляр метода
почему не лучший вариант? ты "статик" предлагаешь сделать?

ссылка по теме
у меня книга есть. купил. кстати, довольно не плохая. оказываетцо, у IE было несколько версий XMLHttp. Вот пример:

PHP:
    /**
    * Создает объект XMLHttpRequest
    * 
    * @param void
    * @return XMLHttpRequest|null
    */
    this.createRequestObject = function()
    {
        if (window.XMLHttpRequest) {
            try {
                req = new XMLHttpRequest();
            } catch (e){}
        }
        // only IE 6 =< 
        else if (window.ActiveXObject) {
            try {
                var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", 
                                 "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp",
                                 "Msxml2.XMLHTTP", 'Microsoft.XMLHTTP'];

                for (var j in aVersions)
                {
                    try {
                        req = new ActiveXObject(aVersions[j]);
                        break;
                    } catch (e){}
                }
            } catch (e){}
        }

        if (!req)
        {
            throw new UserException(CONFIG['messages']['ru']['xmlhttp']['non_install']);
        }
    }

ах да - про call не понял... :(
 

x-yuri

Новичок
почему не лучший вариант? ты "статик" предлагаешь сделать?
я предлагаю
Код:
function obj () {}
obj.prototype.method = function() {}
а не
Код:
function obj () {
    this.method = function() {}
}
потому что в последнем случае у каждого объекта "класса" obj будет свой "экземпляр" метода. В первом будет один на все объекты "класса" obj

'Msxml2.XMLHTTP' и 'Microsoft.XMLHTTP' должно хватить

ах да - про call не понял...
а так? :confused:
Код:
(function f( b ) {
    alert([this.a, b])
}).call({a: 2}, 3);
 

Духовность™

Продвинутый новичок
ок.с прототипами разберусь,спасибо

О_о ты посложнее код не мгу придумать? :D

можно передать функцию в качестве параметра методу get
можно. но как её внутрь onreadystatechange поместить!? вот в чем вопрос.
 

x-yuri

Новичок
можно. но как её внутрь onreadystatechange поместить!? вот в чем вопрос.
любая функция видит все переменные внешних функций + глобальные переменные
Код:
fucntion f( a ) {
    return function() {
        return a;
    }
}
alert( f(3)() );
 
Сверху