AS3 — Как сделать синхронную загрузку асинхронного вызова?

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

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

Например:

    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?


person Community    schedule 16.01.2009    source источник


Ответы (4)


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

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

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.
person inferis    schedule 16.01.2009
comment
Действительно безумие? Это люди, которые написали эти документы - cs.wustl.edu/~schmidt/patterns -ace.html, с ума сошел? Нет ничего безумного в том, чтобы делать что-то синхронно, если нет смысла делать это асинхронно, например, при загрузке ресурсов или инициализации чего-то, и где нет смысла переходить к следующему шагу, если предыдущий шаг еще не завершен. - person Zakus; 06.05.2013

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

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

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

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

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

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

person cliff.meyers    schedule 16.01.2009

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

person vava    schedule 16.01.2009

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

Вот пример реализации: Последовательная демонстрация PureMVC AS3.

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

person bzlm    schedule 29.03.2009