Наилучший подход - ждать, пока все вызовы службы вернут значения в Flex PureMVC.
Я пишу приложение Adobe AIR с использованием PureMVC.
Представьте, что у меня есть представление приложения на основе страниц (с использованием ViewStack), и пользователь каким-то образом перемещается по этим страницам (например, нажимает кнопку или что-то в этом роде).
Теперь, например, у меня есть страница с информацией об учетной записи, которая при создании экземпляра или показе снова должна загрузить данные из WebService (например, электронную почту, баланс учетной записи и имя пользователя), а когда данные будут возвращены, я хочу показать их на своей странице информации об учетной записи в правильные ярлыки.
Проблема в том, что когда я выполню эти три веб-вызова, каждый из них будет возвращать разные resultEvent в разное время. Мне интересно, каков наилучший способ получить информацию о том, что ВСЕ вызовы службы вернули результаты, поэтому я знаю, что наконец могу показать все результаты одновременно (и, возможно, до того, как это произойдет, воспроизвести экран загрузки).
2 ответа
Я бы сделал это следующим образом:
- Создайте прокси для каждого из трех информационных объектов (EMailProxy, BalanceProxy, UsernameProxy);
- Создайте класс делегата, который обрабатывает взаимодействие с вашим WebService (что-то вроде "открытый класс WSConnector реализует IResponder{...}"), который используется прокси для вызова конечных ws-методов;
- Создать прокси, который координирует все три результата (CoordProxy);
- Выберите посредника, который будет координировать все три вызова (например, это может сделать ваш ApplicationMediator);
- Создать константы уведомления для всех результатов прокси (GET_EMAIL_RESULT, GET_BALANCE_RESULT, GET_USERNAME_RESULT, COORD_RESULT);
Пусть ApplicationMediator получит все 4 уведомления;
- важно, чтобы вы не только ждали всех трех результатов, но и были готовы к некоторым ошибкам и их интерпретации. Вот почему простой счетчик может быть слишком слабым.
Общий рабочий процесс может выглядеть следующим образом:
- Пользователь инициирует процесс;
- Какой-то посредник получает событие от вашего GUI-компонента и отправляет уведомление типа DO_TRIPLECALL;
- ApplicationMediator перехватывает это уведомление, удаляет состояние CoordProxy и вызывает все 3 метода из ваших прокси (getEMail, getBalance, getUsername).
- Ответы приходят асинхронно. Каждый прокси получает свой ответ от делегата, изменяет свой собственный объект данных и отправляет соответствующее уведомление.
- ApplicationMediator перехватывает эти уведомления и изменяет состояние CoordProxy. Когда есть все три ответа (могут быть не все успешны), CoordProxy отправляет уведомление с общим результатом.
Я знаю, что это не лучший подход для такого взаимодействия через посредников. Первоначальная идея состояла в том, чтобы использовать команды для всех решений "бизнес-логики". Но создавать бюрократию может быть слишком скучно.
Я надеюсь, что это может помочь вам. Буду рад узнать ваше решение и обсудить его здесь.
Я действительно не очень разбираюсь в PureMVC, но библиотека as3commons-async отлично подходит для управления асинхронными вызовами и прекрасно работает в любой фреймворк-установке
http://as3commons.org/as3-commons-async/
В вашем случае вы можете создать 3 класса, реализующих IOperation
или же IAsyncCommand
(в зависимости от того, планируете ли вы выполнять операции немедленно или с задержкой), инкапсулируя ваши RPC. После этого вы просто создаете новый CompositeCommand
и добавить операции в свою очередь. Когда все будет сделано, CompositeCommand
уволит OperationEvent.COMPLETE
Кстати, библиотека даже включает некоторые предварительно реализованные общие операции Flex, такие как HTTPRequest, когда вы также загружаете пакет as3commons-asyc-flex.