AS3 - Как сделать синхронную загрузку асинхронного вызова? - PullRequest
1 голос
/ 16 января 2009

У меня есть функция, которая асинхронно загружает объект пользователя из веб-службы.

Я оборачиваю этот вызов функции в другую функцию и делаю ее синхронной.

Например:

    private function getUser():User{
            var newUser:User;
            var f:UserFactory = new UserFactory();

            f.GetCurrent(function(u:User):void{
                newUser = u;
            });

            return newUser;
        }

UserFactory.GetCurrent выглядит так:

public function GetCurrent(callback:Function):void{ }

Но я понимаю, что нет никакой гарантии, что когда эта функция будет вызвана, newUser будет фактически новым пользователем ??

Как выполнить функцию возврата этого типа во Flex?

Ответы [ 4 ]

8 голосов
/ 16 января 2009

Так лежит безумие.

Серьезно, вам лучше не пытаться навязать асинхронный вызов какой-то синхронной архитектуре. Узнайте, как система обработки событий работает в вашу пользу, и добавьте обработчик для события результата. На самом деле, вот совет прямо из flexcoders FAQ:

Q: How do I make synchronous data calls?

A: You CANNOT do synchronous calls. You MUST use the result event. No,
you can't use a loop, or setInterval or even callLater.  This paradigm is
quite aggravating at first. Take a deep breath, surrender to the
inevitable, resistance is futile.

There is a generic way to handle the asynchronous nature of data service
calls called ACT (Asynchronous Call Token). Search for this in
Developing Flex Apps doc for a full description.
2 голосов
/ 16 января 2009

Смотрите мой ответ здесь:

DDD и асинхронные репозитории

Flex и Flash Remoting по своей сути асинхронны, поэтому борьба с этой парадигмой доставит вам массу неприятностей. Наши сервисные делегаты возвращают AsyncToken из каждого метода, и у нас никогда не было проблем с ним.

Если вы хотите убедиться, что приложение не отображает новое представление или не выполняет какую-либо другую логику, пока не вернется результат / ошибка, вы можете сделать следующее:

  1. Присоедините прослушиватель событий для пользовательского события, которое вызовет ваш «код результата / ошибки сообщения»
  2. Сделайте асинхронный вызов
  3. Обработка результата / ошибки
  4. Отправка пользовательского события для запуска вашего слушателя с # 1

Имейте в виду, что каждый раз, когда вы делаете асинхронный вызов, вы будете вызывать много раздражающего кода. Я бы очень внимательно подумал, нужен ли вам синхронный путь выполнения.

0 голосов
/ 29 марта 2009

Порт AS3 платформы PureMVC имеет механизмы для реализации синхронных операций в контексте Model-View-Controller. Он не пытается синхронизировать асинхронные вызовы, но позволяет добавить шаблон синхронного приложения для управления ими.

Вот пример реализации: PureMVC AS3 Sequential Demo .

В этом примере пять подкоманд выполняются последовательно, составляя целую команду. В вашем примере вы реализовали бы getUser() как команду, которая будет вызывать commandComplete() в обратном вызове getURL() (или как угодно) Это означает, что следующая команда будет уверена, что операция getUser() завершена.

0 голосов
/ 16 января 2009

Вы не можете преобразовать асинхронный вызов в синхронизированный без чего-то вроде функции sleep (), и, насколько я знаю, в AS3 его нет. И да, не гарантируется, что newUser будет содержать имя пользователя до оператора return.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...