EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

Добавить функцию в класс.

 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> JavaScript, AJAX
Добавить функцию в класс.
Автор Сообщение
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120350 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 07:14    Заголовок сообщения: Добавить функцию в класс. Ответить с цитатой

есть функция.
Код:
 function aj2(co){
         // Create new JsHttpRequest object.
         var req2 = new JsHttpRequest();
         // Code automatically called on load finishing.
         req2.onreadystatechange = function() {
            if (req2.readyState == 4) {
               //alert(req2.responseJS.print);
               return req2.responseJS.print;

            }
         }
         
         req2.open('POST', 'core.php', true);
         req2.send( { q: co } );
 }

При этом возвращается все верно.
есть класс.
Код:
cl = defineClass({

  name: "cl",
 
  construct: function(...) {
....
  },
 
  methods: {
    execute: function() {
...
this.result=aj2(..);
alert(this.result); // undefined
...
}
...


алерт в этом случае возвращает пустоту.
Как засунуть функцию в класс?
ps. :4000
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Александр Михалицын
Согнул ложку
Согнул ложку


Зарегистрирован: 22.08.2008
Сообщения: 924

23430 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 08:22    Заголовок сообщения: Ответить с цитатой

lazutov,
потому, что у тебя стоит ретёрн для метода онрдистатечэйндж! А не для родительской функции... Wink Тоесть ты должен использовать колбэк:
Код:
 function aj2(co){
         // Create new JsHttpRequest object.
         var req2 = new JsHttpRequest();
         // Code automatically called on load finishing.
         req2.onreadystatechange = function() {
            if (req2.readyState == 4) {
               //alert(req2.responseJS.print);
               cl.methods.execute(req2.responseJS.print); //Колбэк

            }
         }
         
         req2.open('POST', 'core.php', true);
         req2.send( { q: co } );
 }


Потом:
Код:
 execute: function(arg) {
aj2();
this.result=arg;
alert(this.result);


З.Ы. С вопросами по ЯваСкрипту можешь сначало ко мне прибегать! Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120350 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 10:50    Заголовок сообщения: Ответить с цитатой

мне кажется, что это работать не будет.
так как там
Код:
execute: function(<void>) {
// подготовка аргумента ф-ии aj2
if (...) {
...
} else
  {
  ...
  this.result=aj2(..);
  alert(this.result); // undefined
  ...
  }
}
...

Просто нет возможности проверить.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Александр Михалицын
Согнул ложку
Согнул ложку


Зарегистрирован: 22.08.2008
Сообщения: 924

23430 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 11:59    Заголовок сообщения: Ответить с цитатой

Все будет работать. Wink Или кинь в конце концов код целиком. Я гляну. Wink

Вот еще вариант. Very Happy

Смотри, вот функция aj2:
Код:
function aj2(co, callback){  //Второй аргумент
         // Create new JsHttpRequest object.
         var req2 = new JsHttpRequest();
         // Code automatically called on load finishing.
         req2.onreadystatechange = function() {
            if (req2.readyState == 4) {
               //alert(req2.responseJS.print);
               callback(req2.responseJS.print); //Колбэк

            }
         }
         
         req2.open('POST', 'core.php', true);
         req2.send( { q: co } );
 }


Тогда твой код:
Код:
cl = defineClass({

  name: "cl",
 
  construct: function(...) {
....
  },
 
  methods: {
    execute: function() {
...
this.result=aj2(..);
alert(this.result); // undefined
...
}
...


Примет вид:
Код:
cl = defineClass({

  name: "cl",
 
  construct: function(...) {
....
  },
 
  methods: {
    execute: function() {
...
var self = this; //Объявим указатель на текущий контекст потому что коллбэк есть прайвит метод, а в прайвит методах this укащывает на глобальный контекст.
function callback(arg) {
   self.result = arg;
}
//EOF
aj2(.., callback); //Добавил второй аргумент и убрал писваивание (оно есть в коллбэке
alert(this.result);
...
}
...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120350 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 12:53    Заголовок сообщения: Ответить с цитатой

тогда такой вопрос:
а если функцию, запихнуть в сам метод - будет работать?
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Александр Михалицын
Согнул ложку
Согнул ложку


Зарегистрирован: 22.08.2008
Сообщения: 924

23430 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 13:06    Заголовок сообщения: Ответить с цитатой

lazutov,
ты имеешь ввиду aj2?
Всмысле просто объявление функции или её код?
Если код, то нет, ибо фунция отработает свой код и не дожидаясь редистэйтчэйнджа побежит дальше, отсюда андефайнед в алерте.

Чем ненравится моя реализация?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120350 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 13:33    Заголовок сообщения: Ответить с цитатой

Сделал как в первом примере.
alert(this.result);
return this.result;
работает.

//alert(this.result);
return this.result;
нет
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 4429

120350 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 13:50    Заголовок сообщения: Ответить с цитатой

Хочу сделать вот так.

Код:
   
this.executed=0;
function callback(arg) {   self.result = arg; self.executed=1; }
   function sleep(milliseconds) {
     var start = new Date().getTime();
     for (var i = 0; i < 1e7; i++) {
      if ((new Date().getTime() - start) > milliseconds){
        break;
      }
     }
   }

this.result=aj2(this.command,callback)
   while(this.executed==0){ sleep(100); }

только оно зависает.
_________________
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Александр Михалицын
Согнул ложку
Согнул ложку


Зарегистрирован: 22.08.2008
Сообщения: 924

23430 Монеты

СообщениеДобавлено: Вс, 08 Мар, 2009 14:59    Заголовок сообщения: Ответить с цитатой

lazutov,
да он и будет подвисать... это же яваскрипт... Wink он не предназначен для циклов такого рода.
и что такое sleep? Very Happy
Цитата:

Сделал как в первом примере.
alert(this.result);
return this.result;
работает.

//alert(this.result);
return this.result;
нет

Всмысле ретерн не работает?
Юзай второй пример. В первом ошибка. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> JavaScript, AJAX Часовой пояс: GMT
Страница 1 из 1

 


Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group