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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JsHttpRequest, return инфы вызывающей функции, какправильно понять асинхронные запросы 
:(
    Опции темы
Alx
Дата 29.3.2007, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



Код

<script>
getHTML("myData");

function getHTML(data) {
var req = new JsHttpRequest();
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.responseJS) {
            alert(req.responseJS.q||'undefined');
        }
    }
}
req.loader = loader;
req.caching = false;
req.open(method, '/sources/loadpage.php', true);
req.send({ q:data });
}
// выводит ALERT = req.responseJS.q;

/////////////

alert(getHTML('myData'));

function getHTML(data) {
var req = new JsHttpRequest();
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.responseJS) {
            return (req.responseJS.q||'undefined');
        }
    }
}
req.loader = loader;
req.caching = false;
req.open(method, '/sources/loadpage.php', true);
req.send({ q:data });
}

//// return не работает... выводит undefined
</script>


subj. как быть, если необходимо присваивать переменным результаты выполнения этой функции?
что-то плохо соображаю.. )

заранее спасибо!

Это сообщение отредактировал(а) Alx - 30.3.2007, 09:49


--------------------
PM MAIL WWW ICQ   Вверх
AKS
Дата 30.3.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


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

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



Код

alert(getHTML('myData')); //// return не работает... выводит undefined

Все закономерно - функция ведь ничего не возвращает.
Цитата

необходимо присваивать переменным результаты выполнения этой функции

А какой результат может быть у этой функции? Она лишь отправляет запрос, а когда будет получен ответ, и вообще будет ли он получен, эта функция не знает...
PM MAIL   Вверх
Sardar
Дата 30.3.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Тут логика немного другая. JsHttpRequest отправляет асинхронные запросы, т.е. getHTML() возвращаеться сразу, не блокируя текущий тред. И это правильно, подвешивать всё ожидая ответа глупо. Вместо return (req.responseJS.q||'undefined'); вызывай какую-нибудь свою функцию, что получить и отрабоает инфу (обновит графики и т.п.).

Блокирующее IO - зло.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 1.4.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



Цитата(Sardar @  30.3.2007,  21:46 Найти цитируемый пост)
Тут логика немного другая. JsHttpRequest отправляет асинхронные запросы, т.е. getHTML() возвращаеться сразу, не блокируя текущий тред

ну это-то понятно, а вот

Цитата(Sardar @  30.3.2007,  21:46 Найти цитируемый пост)
вызывай какую-нибудь свою функцию, что получить и отрабоает инфу (обновит графики и т.п.).

с этого месте, пожалуйста, поподробнее:

Код

{   this.html = '';
    getHTML(filename,this.html);
}
function getHTML(filename,output) { [...blabla..] outputFunc(req.responseJS.q,output); [...blabla..]}
function outputFunc(response,output) {output = response};

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

{   this.html = '';
    getHTML(filename,this);
}
function getHTML(filename,output) { [...blabla..] output.html = req.responseJS.q; [...blabla..]}


или я ошибаюсь?


Цитата(Sardar @  30.3.2007,  21:46 Найти цитируемый пост)
Блокирующее IO - зло. 

что это?) скажи вкратце, буду бояться smile

Это сообщение отредактировал(а) Alx - 1.4.2007, 14:29


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 1.4.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(Alx @  1.4.2007,  13:26 Найти цитируемый пост)
я могу отправить только ссылку на объект, но не ссылку на свойство объекта, поэтому свойство приходится для всех использовать одно и то же, что очень неудобно:


Код

function bind(obj, method) {
  return function() {
     if(obj.method instanceof Function) obj.method.apply(obj, arguments);
     else throw "Logic exception: method '"+method+"' expected";
  }
}

function myObj(f) {
    this.field = f;
}

function myObj.prototype.mymethod(data) {
    alert(this.field + ': ' + data);
}

getHTML('myData', alert);
getHTML('myData', bind(new myObj('myfield'), 'mymethod'));

function getHTML(data, handler) {
var req = new JsHttpRequest();
req.onreadystatechange = function() {
    if (req.readyState == 4) {
        if (req.responseJS) handler(req.responseJS.q || undefined);
        //else не забудь обработку ошибок, а то тихо в игнор идёт
    }
}
req.loader = loader;
req.caching = false;
req.open(method, '/sources/loadpage.php', true);
req.send({ q:data });
}



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 1.4.2007, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



какой-то код мне вообще не понятный.. чувствую себя ламером.. возвращает ошибку "исключение брошено и не поймано".. что это вообще значит?

функцию bind() вообще не понял.. можешь объяснить? прямо построчно..

пасиб...  smile 

Это сообщение отредактировал(а) Alx - 1.4.2007, 17:38


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 1.4.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(Alx @  1.4.2007,  16:38 Найти цитируемый пост)
возвращает ошибку "исключение брошено и не поймано"

Ага, это я когда на коленке пишу, не проверяя, бывает smile
Код
//замени
//if(obj.method instanceof Function) obj.method.apply(obj, arguments);
//на
if(obj[method] instanceof Function) obj[method].apply(obj, arguments);


bind просто создаёт closure, который вызывает конкретный метод объекта. Если он не сушествует, то кидаем исключение.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 2.4.2007, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



Цитата(Sardar @  1.4.2007,  15:55 Найти цитируемый пост)
instanceof Function

Цитата(Sardar @  1.4.2007,  15:55 Найти цитируемый пост)
apply(obj, arguments);

Цитата(Sardar @  1.4.2007,  15:55 Найти цитируемый пост)
throw

Цитата(Sardar @  1.4.2007,  17:49 Найти цитируемый пост)
closure

вот эти выражения мне вообще неизвестны... пипец..

ну лана, посмарю в доках, объясни плиз хотябы тогда:
1)зачем внутри функции ещё одна функция, если кроме неё ничего нет?
2)какую роль играет return?

3)и ещё мне непонятно, какие же параметры приходят функции bind(), если тут
Цитата
getHTML('myData', bind(new myObj('myfield'), 'mymethod'));

1 параметр - ссылка на объект, второй - строка, а тут
Цитата
handler(req.responseJS.q || undefined);

снова первый параметр строка...

4) как это блин все работает? 5) что конкретно, какой тип данных содержится в переменной handler?..

оооох... мне стыдно... так хочется все это понять.. сейчас только понимаю, насколько реально я отстал от жизни..


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 2.4.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(Alx @  2.4.2007,  02:03 Найти цитируемый пост)
1)зачем внутри функции ещё одна функция, если кроме неё ничего нет?

Это closure, вбей это слово в поиск в основном разделе. В кратце, JS поддерживает функции высшего порядка, т.е. функция это объект и как любой другой объект её можно вернуть или записать в переменную. Именно объект а не строка с именем, как это было в PHP.

При определении функции мы "запоминаем" все переменные, что были видны на момент определения, в нашем случае нам интересны аргументы внешней функции. Функция bind возвращает closure (функцию), что продолжает видеть оригинальные значения obj и method, и соответственно может при её вызове.

Цитата(Alx @  2.4.2007,  02:03 Найти цитируемый пост)
2)какую роль играет return?

Он возвращает функцию, как и любое другое значение. Что бы было ясно:
Код
var obj = new myObj('myfield');
var handler = bind(obj, 'mymethod');

obj.mymethod("Hi!");
handler("Hoi!"); //эквивалентно предыдущей строчке


3) - на это ты уже сам можешь ответить, читай предыдущий абзац smile
5) - функция

Я и Zeroglif много размышляли на эту тему. Вбей в поиск closure, instanceof, prototype this.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 3.4.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



Цитата(Sardar @  2.4.2007,  11:00 Найти цитируемый пост)
//эквивалентно предыдущей строчке

вот этого-то я и не понимаю! зачем такой дикий изврат из 3-х функций, если можно просто вызвать одну???


--------------------
PM MAIL WWW ICQ   Вверх
Sardar
Дата 4.4.2007, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(Alx @  3.4.2007,  22:21 Найти цитируемый пост)
зачем такой дикий изврат из 3-х функций, если можно просто вызвать одну??? 

Потому что это не фича вызывать методы объектов, это вообще замыкание любого кода. Замкнутый код можно затем вызвать, он будет "видеть" окружение (переменные) существовавшее на момент создания замыкания. Естественно от одного замкнутого участка кода можно получить сколь угодно конкретных замыканий (пары {окружение, код}).

Когда-нибудь ты врубишся в фишку, затем поудивляешся как ты мог программить без них smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alx
Дата 5.4.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

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



Цитата(Sardar @  4.4.2007,  19:13 Найти цитируемый пост)
Когда-нибудь ты врубишся в фишку, затем поудивляешся как ты мог программить без них  

мда, можеть быть smile но пока, я как-то далек от понимания..)


--------------------
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




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


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

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