Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > gwt rpc не понятки


Автор: fara86 6.8.2009, 13:46
есть пару методов возращяющее название времен года и месяцы
мне нужно получить название времени года и какие у него месяцы
делаю так
Код

......................... 
final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
greetingService.getSeason(new AsyncCallback() { 
public void onSuccess(Object result) { 
String[] res = (String[]) result; 
for (int j = 0; j < res.length; j++) { 
system.out.println(res[j]); 
greetingService.getMonth(res[j],new AsyncCallback() { 
public void onSuccess(Object result) { 
String[] res = (String[]) result; 
for (int i = 0; i < res.length; i++) { 
system.out.println(res[i]); 
} 
} 
}); 

} 

} 
});

но, получаю к примеру
лето
зима
весна
осень
июнь
июлю
.....................
хоть и у меня getMonth() вызывается в цикле getSeason() но все равно пока весь getSeason() не выполнится, до getMonth() дело не доходит, где ошибка у меня?

Автор: andyhomes 6.8.2009, 14:45
Помедитируйте на досуге про однопотоковую среду (JS), асинхронные вызовы, DeferredCommand (прицепом).



Автор: fara86 6.8.2009, 14:47
Цитата(andyhomes @  6.8.2009,  14:45 Найти цитируемый пост)
омедитируйте на досуге про однопотоковую среду (JS), асинхронные вызовы, DeferredCommand (прицепом).


Да я понял, что это с синхронными и асинхронными вызовами связанно, но как применить к моей задаче, тока такой вариант в голову лезет=)

Автор: fara86 7.8.2009, 07:18
т.е. мне нужно применить синхронный вызов правильно?

Автор: andyhomes 7.8.2009, 08:35
Цитата(fara86 @  7.8.2009,  07:18 Найти цитируемый пост)
а по сути мне надо чтоб выполнение шло как обычно, т.е. пока предыдущая строчка кода не выполнилась следующую не выполнять=)

Так и работает, по-другому - никак.


Ну, а чтобы реализовать то, что вы хотите...
можно, например, использовать очередь для сизонов
и инициировать обработку следующего в методе получения месяцев (в колбэке, естественно).

Автор: fara86 7.8.2009, 08:41
Цитата(andyhomes @  7.8.2009,  08:35 Найти цитируемый пост)
Ну, а чтобы реализовать то, что вы хотите...можно, например, использовать очередь для сизонови инициировать обработку следующего в методе получения месяцев (в колбэке, естественно).

А чуть подробнее нельзя?
А что gwt не поддерживает синхронные вызовы?
Я провел тестик маленький
объявляю массив строк 
Код

String[] res=new Strin[5];

затем в методе

Код

........................
public void onSuccess(Object result) {
res = (String[]) result;
System.out.println(res[0]);
}

вывожу res[0];
и после опять вывожу 
Код

.................
System.out.println(res[0]);


но на консоли выводится 
null
Лето
т.е. получается доходит дело до onSuccess() и не получив ответа он продолжает выполнять программу, а как ответ пришел в callback то выводится на экран лето

Автор: andyhomes 7.8.2009, 09:22
Цитата(fara86 @  7.8.2009,  08:41 Найти цитируемый пост)
А что gwt не поддерживает синхронные вызовы?

GWT, в общем-то, тут не причем. Он только компилирует ваш код на Java в JavaScript.

Нужно понимать как работает AJAX.
А работает он, грубо говоря, через XmlHttpRequest (XHR).
JS в браузере (однопотоковая среда) может посредством XHR отправить запрос,
но время его исполнения не известно и может быть долгим,
и в случае синхронного вызова JS бы просто простаивал, ожидая завершения запроса.

Поэтому XHR-у сообщаются JavaScript-callback-методы, которые он (XHR) вызывает
в окончании обработки запроса.
Зато, паралельно с выполнением AJAX-запрос(а/ов), JS может продолжить свою работу...

Короче, синхронность сами реализуйте.
Подумайте, в свете новых представлений, как это можно сделать.
Ну очередь - это один вариант, флаги какие-нибудь можно прикрутить, таймеры...
Можно, конечно и с другой стороны подойти - максимально использовать выгоды AJAX.

Автор: fara86 7.8.2009, 09:26
мда нет синхронности помоему это минус большой, т.е. если допустим пользователь логинится, еше не получив ответа он выполняется другая часть кода, глупо это, а реализовывать свое это не изящно, но как вариант пойдет=(

Автор: andyhomes 7.8.2009, 09:39
Цитата(fara86 @  7.8.2009,  09:26 Найти цитируемый пост)
мда нет синхронности помоему это минус большой

Это данность.

Цитата(fara86 @  7.8.2009,  09:26 Найти цитируемый пост)
т.е. если допустим пользователь логинится, еше не получив ответа он выполняется другая часть кода

Это "кривые руки".

Цитата(fara86 @  7.8.2009,  09:26 Найти цитируемый пост)
глупо это, а реализовывать свое это не изящно, но как вариант пойдет=( 

Глупо - делать выводы, не изучив достаточно технологию.

Смотрите примеры, думайте, изучайте...

Автор: fara86 7.8.2009, 10:59
Цитата

Это "кривые руки".


Тогда у всех программистов кривые руки, так как нет идеального кода=)

Цитата

Глупо - делать выводы, не изучив достаточно технологию.

Смотрите примеры, думайте, изучайте...

если вы знаете изящное решение моей проблемы может поможете, а то сказать типо смотри доки и т.д каждый может сказать

Автор: andyhomes 7.8.2009, 11:24
Задачу опишите.

PS
И не надо вот это вот разводить:
выдергивать фразы из контекста, обобщать...

На Земле милион AJAX-разработчиков, и никто не испытывает проблем с асинхронными методами.
И вы станете милион первым, как только разберетесь в предмете.

Автор: fara86 7.8.2009, 11:30
Цитата(andyhomes @  7.8.2009,  11:24 Найти цитируемый пост)
На Земле милион AJAX-разработчиков, и никто не испытывает проблем с асинхронными методами.И вы станете милион первым, как только разберетесь в предмете.

Я не спорю с этим, но шас не могу разобраться, не до понимаю, вот и прибегаю к помощи из вне=)
суть такая к примеру из базы дергается нащвание времени года, затем на основе результата дергаются месеца относящиеся ко времени года и нужно это отобразить но получается чушь смотрите первое сообщение как мне нужно!

Автор: andyhomes 7.8.2009, 12:55
Цитата(fara86 @  7.8.2009,  11:30 Найти цитируемый пост)
суть такая к примеру из базы дергается нащвание времени года, затем на основе результата дергаются месеца относящиеся ко времени года и нужно это отобразить но получается чушь смотрите первое сообщение как мне нужно!

Это что, курсовая/тестовая работа?

Если нет, то предлагаю переместиться на уровень выше (в описании задачи)...
А то, похоже, мы имеем дело с какой-то кривой и тупиковой веткой возможных решений неизвестной нам (кроме вас) задачи.

Ну, а если да...
Заведите переменную, например, idx - содержит индекс обрабатываемого элемента массива сезонов.
Получив сезоны вызываете функцию получения месяцев для первого элемента массива сезонов (idx=0)

Получив месяцы, в колбек-методе делаете вывод информации, инкремент idx
и новый вызов получения месяцев...
Ну, естественно, нужно проверять границы индекса.

Автор: fara86 7.8.2009, 13:15
Вроде нормальный примерчик=)
ладно тогда вот такой вот
Код

public int getValue() { 
final AsyncCallback callback = new AsyncCallback() { 
public void onSuccess(Object result) { 
res = (int) result; 
} 
public void onFailure(Throwable caught) { 
System.out.println("фигня"); 
} 
}; 
greetingService.getValue(callback); 
return res; 
}

сначало происходит return res а потом уже тока ответ приходит, каким образом сделать чтоб не выполнялся return res пока не придет ответ от сервера?

Может не rpc использовать, а другое чтонить?

Автор: fara86 11.8.2009, 07:42
Ну что ни кто не сталкивался с подобными проблемами?

Автор: andyhomes 11.8.2009, 08:32
Цитата(fara86 @  11.8.2009,  07:42 Найти цитируемый пост)
Ну что ни кто не сталкивался с подобными проблемами? 

Это не проблемы...

Попробуйте думать в ключе функциональности приложения, а не метода.

Автор: fara86 11.8.2009, 08:54

andyhomes

да нет это проблемка,и ее как то можно решить изящно раз нет синхронных вызовов, ислиб были бы и те и те то проблем не было бы!выше описанный Вами вариант тоже не подходит=)тут что то надо другое!




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)