Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Синхронный обмен клиент-сервер (http://www.flasher.ru/forum/showthread.php?t=125417)

bmikle 23.05.2009 19:58

Синхронный обмен клиент-сервер
 
Всем привет. Ситуация такая: Использую связку
Java + BlazeDS + Flex, все работает прекрасно, но появилась новая задача:
нужно на клиенте выполнить проверку, которую может сделать только сервер.
А именно проверка добавляемой пользователем строки в таблицу на уникальность полей.

Как осуществить проверку когда все запросы на сервер асинхронные? Как остановить выполнение программы до получения ответа от сервера?

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

7thsky™ 24.05.2009 00:12

Синхронный запрос на сервер - пока не реализуем. Смотрите другие варианты

bmikle 24.05.2009 02:20

С этим уже смирился..
можно я приведу ужасный код а вы мне скажите что здесь можно поправить?


Код AS3:

 
<mx:RemoteObject id="balanceService" destination="balanceService" result="test()"/>
 
var res = false;
private function test:void
{
        res = true;
}
 
private function main():void
{
      ....
      balanceService.getTest();
      while (!res);
      ................
}

в этом случае будет выполняться цикл пока не придет ответ. Я ПРЕКРАСНО ПОНИМАЮ что это бред и так писать нельзя, но в некоторых языках есть методы реализующие то же самое только коректно, например управление потоками в C#. Не помню точно как но там можно написать что то вроде
Thread.wait(res) - идея такая.
Возможно ли подобным образом организовать остановку выполения во флексе?

etc 24.05.2009 10:46

Нет, нельзя, AVM работает в одном потоке.

bmikle 24.05.2009 11:56

Спасибо :) А другие типы взаимодействия клиент-сервер?
Web-service, ... (больше не знаю)
Они все асинхронные?

etc 24.05.2009 12:02

Цитата:

Сообщение от bmikle (Сообщение 822523)
Они все асинхронные?

Без исключения.

bmikle 24.05.2009 15:58

Большое спасибо, вопрос исчерпан :)

IDimitry 25.05.2009 03:41

Можно "по-каличному" сделать синхронный запрос: через внешний интерфейс выполнять javascript'ом через ajax синхронный запрос (абсурдно, но позволяет) запрос, получать ответ и возвращать назад во флеш. На время ожидания блокировать ввод. Очень чревато, так как на время ожидания поток javascript останавливается полностью, даже таймеры и хандлеры. Если не обращать на безопасность передачи, то выполнимо.

etc 25.05.2009 09:23

А зачем вообще это делать?

bmikle 25.05.2009 15:04

To IDimitry: Спасибо ) но через Javascript это все таки слишком ))
То Etc: Я в первом вопросе объяснял зачем - чтобы встроить запрос в целую линейку разных проверок. То есть например оп реакции пользователя начнаем проверять корректность данных, проверяем введенные значения регуляркой и тд...
Так вот если мы хотим одну из проверок выполнить на сервере, например проверить уникальность объекта, то нам придется разбивать цепочку проверок как минимум на две части:
1) первая часть - заканчивающаяся посылкой запроса
2) вторая часть - в обработчиках событий result и failed.

Очень обидно идти на такие ухищрения ради одного boolean

Может быть кто то подскажет грамотное архитектурное решение? Я сам на FLEX пишу не давно, и возможно невольно тащу сюда привычки из offline кодинга.

etc 25.05.2009 15:20

bmikle, ну, последним этапом будет проверка на сервере и всё. Бросьте свои offline-привычки, тут другие правила :)

IDimitry 25.05.2009 15:29

Исключительно через событийную модель, а не линейно-процедурную.
А если более "приземленно", то, допустим, некая функция обрабатывает (получает) твои параметры и отсылает на сервер для проверки и ничего не ждет - она просто заканчивает свою работу :). Продолжение наступит после того, как сервер вернет ответ и вызовется соответствующий обработчик. Это, конечно, достаточно примитивное объяснение, но надеюсь, суть ты уловишь ...

Foli 25.05.2009 17:03

Цитата:

Сообщение от bmikle (Сообщение 822421)
А именно проверка добавляемой пользователем строки в таблицу на уникальность полей.

Что возвращает функция которая сохраняет строчку в БД?
Какой тип?

bmikle 01.06.2009 21:15

Цитата:

Сообщение от Foli (Сообщение 822918)
Что возвращает функция которая сохраняет строчку в БД?
Какой тип?

Она собственно ничего не возвращает, она плюет Exception при ошибке добавления. Но это собственно не важно, я легко могу отловить это исключение, вернуть во Flex и вывести пользователю ругательство. НО! Для этого надо передать все добавляемые объекты на сервер (их может быть много)... а потом в случае некорректных данных еще раз - уже исправленные и так далее.. не очень рационально.
Гораздо правильнее на мой взгляд реализовать на сервере проверочные методы типа

Код:

boolean isUserNamesUnique(List<String> names) {
...
}

и перед отправкой всех объектов сначало проверить их корректность.

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

PS: Я вас с удовольствием подонимаю по другому вопросу в новой теме )


Часовой пояс GMT +4, время: 22:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.