![]() |
Неудобная организация сервера. Коллбеки
Коллеги, я уж зажрался наверное, но привык работать на приятном исполнении сервера. А тут мне вот что дают :
Вызываю гетом/постом - некий скрипт сервера, получаю ответ. Это все хорошо, все понятно. В ответ только приходит JSON - в котором не указана команда которую вызвали. То есть какой бы я запрос не делал на данный сервер - я не могу знать в итоге, какой именно я запрос делал. Сейчас это общий случай Код AS3:
Кто нить работал с такми ПРОГРЕССИВНЫМ!!!! апи... и как выходили из ситуации в рамках ООП, а не костылях |
Класс - операция
Создаете объект этого класса, вызываете метод с параметрами. Он внутри нужно запоминает, сам делает запрос, и сам обрабатывает ответ и выдает вам, в каком угодно виде. Типа Код AS3:
Также можно вообще урл зашить в операцию и делать предобработку ответа в классе, приводить джсон к списку друзей или юзеринфе и в коллбек выкидывать готовый для работы объект(ы). |
GBee - вот такой вот подход обычно и является другом девочки *утечки памяти*. Я естественно понимаю, как это сделать. Тут именно вопрос как сделать красиво, не пересоздавая каждый раз классы
|
Вам шашечки или ехать? Это просто обертка над лоадером, вы же все равно новый лоадер создаете.
Можно забацать маппинг тип=запрос+параметры (в хмл или хардкодом или как угодно) и автоматизируете все это, чтобы само все там что-то делало. У вас же все равно где-то есть вызов. Непонятно, у вас урлы что ли не отличаются никак? Тыкаетесь в один, а он разные ответы шлет? |
Т.е вам не пришел комплит от старого запроса, а вы уже новый реквестите. Прикольно.
|
Цитата:
|
Только в том если последовательность ответов имеет значение.
|
Я с Пчолом согласен.
Тут "команда" спасет. Один запрос - одна команда. (Либо нечто похожее на RPC.) Ты ее вызвал - она сама отработала, сама результат получила, сама разобралась что с ответом делать. Чтобы не было утечек нужно предусмотреть какой-то CommandController. В котором будет храниться список текущих активных команд. Плюс например сама команда будет в это контроллер диспатчить "комплит" по завершению обработки ответа, а контроллер ее грамотно дестроить. Хотя я бы по голове серверщикам настучал лучше, ибо все мои привычные подходы подразумевают асинхронный подход к общению с сервером. Но если бы "був час та натхнення" - то заморочился бы так как описал. |
я просто делаю массив (колбэков или типов событий для диспатча) и массив реквестов, пушу все в массив , и начинаю загрузку, с нулевого элемента, когда приходит ответ, делаю то что надо с ответом и колбек функцией, и делаю шифт массивов, и перевызываю функцию загрузки.
|
Другими словами, ты создаешь очередь и сдвигаешь ее по мере прихода комплита, посылая очередной реквест от следующего элемента в очереди. Если, так, то правильно. Только непонятно, что такое "пушить асинхронно".
|
имелось ввиду, что можно сразу много запросов добавить из любой части программы, а не ждать выполнения каждого, чтобы добавить следующий
|
Слово "асинхронно" не несет никакой смысловой нагрузки, потому как непонятно как еще можно формировать очередь на одном клиенте. Кстати, в соседней ветке правильный подход показан с флоксом.
|
удалю его раз оно вас так напрягает)
|
Спасибо парни. Значит будем работать по методу пчела и дикобраза вместе.
Насутчать им по пальцам надо конечно, но что поделать - говорят у нас уже как сто лет двиг написан и мы, такие вот умные - с нашим АПИ уже все работабют и никто не жалуется ( типа на разных языках ) . Добавлено через 38 минут Если кому интересно, как я сделал Код AS3:
|
Лучше бы не показывал.
С этого момента уже весело стало. Код AS3:
|
По пальцам стучать он собрался.
Код AS3:
|
Короче конструктивнее отвечу, а то совесть мучает.
0. То что ты показал - дефолтное решение, с которого ты и начал, тупо хрень которая вместо подписки на комплит дает регистрацию коллбеком. Хотя суть реально та же. Твоя обертка ничем не помогает решить вопрос. 1. Кто угодно, откуда угодно может заспамить месадж с какой угодно обработкой(коллбеком). 2. ServerConnection - раз уж на то пошло - лучше сделать интернал классом, чтоб напрямую к нему доступа не было. Только через твою фабрику-манагер. 3. Никаких подписок на ерроры и таймауты. 4. Никакого кеша/пула/очереди. Тупо создал лоадер в небытие и забыл про него. 5. Удаляться мусорщиком твои лоадеры не будут из-за колбека. Возможность "отписки" не предусмотрена. 6. Создание лоадера происходит идентично дефолтному - тупо урл гет-пост и параметр. Человеческий фактор не исключен ни на грамм. 7. Коллбеки нетипизированные (еще один пункт к человечкому фактору). Типизация коллбека во флеше проблематична. Но никто не отменял стратегию или как минимум интерфейс, ограничивающий г-нокод в этих местах. Итого вопрос: А что ты сделал то? И зачем? С таким подходом - чем урллоадер напрямую хуже, кроме экономии копипасты пяти строк кода подписки на комплит? Добавлено через 6 минут А столько текста и негодования я вылил по этому вопросу потому что в нашем проекте умельцы запилили такую же систему. И уж поверь мне. Она не рабочая. Или делай нормально или лучше юзай лоадер напрямую. |
Цитата:
|
Ну с этим я может и загнался.
Остальное в силе. |
Код AS3:
Тут о безопасности речь не идет, она нас не беспокоит. Тут именно стоял вопрос, чтобы не было проблем, что какое то соыбтие придет раньше и мы не знаем какое. А тут все собственно понятно. Пускай коллбеки, ну куда деваться. А чего у вас там в проекте столо не рабочим то? Вполне себе быдло-подход на быдло-сервер, все логично. Цитата:
На остальные 7 пунктов отвечать не буду, ты прав - но ты прав в контесте своего проекта, тут так скажем совсем мелкая поделка в 100 строчек, а не огромная игра, чтобы парится. А вопрос я задал, ибо мне было интересно , как подругому оно могло решаться. |
Я ничего не имею против этого куска кода в контексте мелкой поделки. Вполне рабочий кусок.
Но зачем тогда выкладывать? Чтоб тот же апокалипсис подумал что это норм подход и так и дальше надо? |
Цитата:
я когда думаю о связи с сервером, то почему-то в сторону команд смотрю, не знаю на сколько это правильно. Но был бы рад, если бы мне сказали названия готовых решений, которые можно взять для изучения за идеал. Flox-клиент, это то, что нужно для связи приложения с сервером? |
Я думаю это отдельная тема. Хочешь - начни. А тут оффтопить нефиг.
|
Dukobpa3 - так покажи как надо! Мне вот лично в голову не пришло как здесь сделать событийную модель, может быть не дорос еще, кроме как колбечный порт я ничего не вижу лучше в данной ситуации, а безусловно хочется
Код AS3:
|
Цитата:
если честно я делаю не колбек функциями, а диспатчу событие с пришедшим объектом, а главный контроллер подписан на разные события и делает то что надо, не знаю какой подход правильней , колбэчный или с диспатчем, а если и тот и тот туфта, какой тогда правильный? Желательно с МВЦ-шной стороны Цитата:
но сюда вот из этой схемы http://www.flasher.ru/forum/attachme...0&d=1336316055 у контроллера должна быть прямая ссылка на загрузчик, и они должны обмениваться коммандами, а не контроллер должен слушать загрузчик... |
А если нужна очередь, то может id сделать и проверять на currentComplete.
Да и подписку можно по id сделать. Но так как я ещё такого не делал, то согласен, что весу в моих словах - не о чём :) |
Цитата:
|
Isfet, я бы новый реквест посылал в хэндлере сервисного контроллера где бы и ловил расширенный эвент с urlLoader.data...
Добавлено через 7 минут Akopalipsis, Вы совешенно правильно рассуждаете. И тут возможно даже не только id, а целый путь к id нужного вида. Все зависит от того уникальный у вас id для вида или вы его индексируете. Допустим, некоторые юниты у Вас повторяются в разных локациях. |
Цитата:
как я уже понял, из ранней с вами беседе, сервисный контроллер - это контроллер который общается с сервером, но у нас также есть главный контроллер. Главный контроллер слушает сервисный контроллер , и когда в сервисный контроллер приходят данные с сервака, он в хендлере onComplete проверят данные на ошибки и диспатчит событие с пришедшими данными - > главному контроллеру и делает следующий реквест. Главный контроллер подписан на все возможные события и в хендлерах делает с данными то что ему нужно, поправьте меня если вы имели ввиду что-то другое. |
Цитата:
Создал класс, зарядил его ссылкой и прочим и в словарь с id. И допустим он был по очереди id=2, а с сервера пришло для id=4? но нужно третий. По этому проверяешь currentID и если он равен 2, то мы просто ждем третий, а когда третий придёт и мы его используем, то проверим, есть ли там следующий. И мне кажется что это единственный-оптимальный способ соблюдения очереди. Но вот только если на деле запросы частые, и на деле разница доли секунд, то словари, id и прочее только замедлят работу. Добавлено через 5 минут Цитата:
|
Правильно. Контроллеры общаются друг с другом посредством диспатчей, а обрабатывают события в хэндлерах, где и передают данные сервис<-> вид, либо сервис<->логика(модель).
|
Цитата:
Да и мне до сих пор система не понятна, а пример бы посмотрел. Теоретически должно адекватно смотреться в связке с флексом. |
Я учёл пожелания. Теперь у меня по другому сделано. Есть дикт из коллекций MVC которые имеют свойства INodeIn и INodeOut c интерфейсом INode, где INode может быть либо XML, либо JSON. Пока еще не допилено...
|
Цитата:
Цитата:
Недавно наводил порядки там и выпилил немного костыльного функционала, в том числе и криво написанный хттп-коннектор, в итоге там остался реализован только сокет(хттп уже давно не использовал, так я и не переживал). Но я планировал добавить туда и хттп-коннектор. Возможно как раз будет повод. Я честно вот сегодня пытался на костылях нечто собрать чтоб сюда скинуть, но костыли мне не понравились. Сделаю адекватно, расширю функционал своего пакета. Можно за репозиторием следить. Добавлено через 4 минуты Костыли частично показать могу: Абстрактная команда. Ее расширяют наши остальные конкретные команды. Код AS3:
Код AS3:
Код AS3:
Код AS3:
Эта часть сравнительно не костыльная получилась и надеюсь идею передал. А вот по части менеджмента этих команд уже есть варианты. И с этими вариантами начались костыли на решение которых я уже не захотел тратить больше времени чем планировал. Добавлено через 11 минут Вот пример использования костыльного манагера, который я показывать не хочу:) Код AS3:
|
Цитата:
Код AS3:
|
I hate JQuery
Добавлено через 46 секунд Предложенный вариант не избавит от безымянных, непонятно где висящих объектов, а только добавит их. Добавлено через 3 часа 11 минут И, кстати, чем вот это: Код AS3:
|
Это не JQuery, а method chaining :)
Можешь набросать примерно, как с точки зрения пользовательского кода выглядит хорошая на твой взгляд система? |
Я думаю не сможет.
Тут сам по себе подход сервера убог, а значит сделать под него хорошую систему уже не получится. Как мне кажется не стоит выдумывать какие то велосипеды на клиенте, когда сервер-сайд хренов. Надо менять сервер. В момем случае стояла задача сделать БЫСТРО, и чтобы работало. 3-5 дней на реализацию подкладки. Понятное дело, если бы сроки были приемлимые, можно было бы сделать нормальтной эко систему, но тут пришлось безоговорочно работать с тем, что написано уже давно. |
Цитата:
|
GBee - если ты работаешь с медиа серверами например, у тебя есть серверные методы и сообщения. Там все понятно. Если ты работаешь с серверами типа пхп - то тут сложнее, и требуется удобная организация сервера - когда ты делаешь запрос, в ответе ты должен получать command:What_the_fox_say - чтобы значть на какую конкретно команду пришел ответ. Это не странность - это нормальность. Я же не несу фигни типа - ну а почему на сервере переменную назвали коряво? Это не мое дело. Мое дело получить ответ, который будет понятен и читабелен.
Потрачено. |
| Часовой пояс GMT +4, время: 09:00. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.