|
Добавить функцию в класс.
|
| Автор |
Сообщение |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вс, 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 _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вс, 08 Мар, 2009 08:22 Заголовок сообщения: |
|
|
lazutov,
потому, что у тебя стоит ретёрн для метода онрдистатечэйндж! А не для родительской функции... Тоесть ты должен использовать колбэк:
| Код: | 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); |
З.Ы. С вопросами по ЯваСкрипту можешь сначало ко мне прибегать!  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вс, 08 Мар, 2009 10:50 Заголовок сообщения: |
|
|
мне кажется, что это работать не будет.
так как там
| Код: | execute: function(<void>) {
// подготовка аргумента ф-ии aj2
if (...) {
...
} else
{
...
this.result=aj2(..);
alert(this.result); // undefined
...
}
}
... |
Просто нет возможности проверить. _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вс, 08 Мар, 2009 11:59 Заголовок сообщения: |
|
|
Все будет работать. Или кинь в конце концов код целиком. Я гляну.
Вот еще вариант.
Смотри, вот функция 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 Сообщения: 3840
111220 
|
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вс, 08 Мар, 2009 13:06 Заголовок сообщения: |
|
|
lazutov,
ты имеешь ввиду aj2?
Всмысле просто объявление функции или её код?
Если код, то нет, ибо фунция отработает свой код и не дожидаясь редистэйтчэйнджа побежит дальше, отсюда андефайнед в алерте.
Чем ненравится моя реализация? _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вс, 08 Мар, 2009 13:33 Заголовок сообщения: |
|
|
Сделал как в первом примере.
alert(this.result);
return this.result;
работает.
//alert(this.result);
return this.result;
нет _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
lazutov while (1==1);


Зарегистрирован: 30.04.2007 Сообщения: 3840
111220 
|
Добавлено: Вс, 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); } |
только оно зависает. _________________ сервис DNS | разные http, DNS и прочие утилиты |
|
| Вернуться к началу |
|
 |
Александр Михалицын Согнул ложку

Зарегистрирован: 22.08.2008 Сообщения: 860
18841 
|
Добавлено: Вс, 08 Мар, 2009 14:59 Заголовок сообщения: |
|
|
lazutov,
да он и будет подвисать... это же яваскрипт... он не предназначен для циклов такого рода.
и что такое sleep?
| Цитата: |
Сделал как в первом примере.
alert(this.result);
return this.result;
работает.
//alert(this.result);
return this.result;
нет |
Всмысле ретерн не работает?
Юзай второй пример. В первом ошибка.  _________________ Пригласительные коды |
|
| Вернуться к началу |
|
 |
|