Наилучший подход - ждать, пока все вызовы службы вернут значения в Flex PureMVC.

Я пишу приложение Adobe AIR с использованием PureMVC.

Представьте, что у меня есть представление приложения на основе страниц (с использованием ViewStack), и пользователь каким-то образом перемещается по этим страницам (например, нажимает кнопку или что-то в этом роде).

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

Проблема в том, что когда я выполню эти три веб-вызова, каждый из них будет возвращать разные resultEvent в разное время. Мне интересно, каков наилучший способ получить информацию о том, что ВСЕ вызовы службы вернули результаты, поэтому я знаю, что наконец могу показать все результаты одновременно (и, возможно, до того, как это произойдет, воспроизвести экран загрузки).

2 ответа

Я бы сделал это следующим образом:

  1. Создайте прокси для каждого из трех информационных объектов (EMailProxy, BalanceProxy, UsernameProxy);
  2. Создайте класс делегата, который обрабатывает взаимодействие с вашим WebService (что-то вроде "открытый класс WSConnector реализует IResponder{...}"), который используется прокси для вызова конечных ws-методов;
  3. Создать прокси, который координирует все три результата (CoordProxy);
  4. Выберите посредника, который будет координировать все три вызова (например, это может сделать ваш ApplicationMediator);
  5. Создать константы уведомления для всех результатов прокси (GET_EMAIL_RESULT, GET_BALANCE_RESULT, GET_USERNAME_RESULT, COORD_RESULT);
  6. Пусть ApplicationMediator получит все 4 уведомления;

    • важно, чтобы вы не только ждали всех трех результатов, но и были готовы к некоторым ошибкам и их интерпретации. Вот почему простой счетчик может быть слишком слабым.

Общий рабочий процесс может выглядеть следующим образом:

  1. Пользователь инициирует процесс;
  2. Какой-то посредник получает событие от вашего GUI-компонента и отправляет уведомление типа DO_TRIPLECALL;
  3. ApplicationMediator перехватывает это уведомление, удаляет состояние CoordProxy и вызывает все 3 метода из ваших прокси (getEMail, getBalance, getUsername).
  4. Ответы приходят асинхронно. Каждый прокси получает свой ответ от делегата, изменяет свой собственный объект данных и отправляет соответствующее уведомление.
  5. 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.

Другие вопросы по тегам