Существует ли универсальный способ синхронизации нескольких асинхронных результатов во Flex? - PullRequest
1 голос
/ 02 сентября 2011

Мне было интересно, есть ли у нас собственный или общий способ синхронизации нескольких результатов от асинхронных вызовов HttpService в Adobe Flex. Другими словами, мне нужно восстановить некоторые данные с моего сервера и выполнить функцию после того, как я восстановил все данные из этих различных функций.

Вот пример:

private var mObj01 : Object = null;
private var mObj02 : Object = null;
private var mObj03 : Object = null;

public function TryLoadSynchronousFunction() : void
{
    if( mObj01 != null && mObj02 != null && mObj03 != null )
        DoSynchronizedStuff();
}

public function GetObj01( event : ResultEvent ) : void
{
    mObj01 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function GetObj02( event : ResultEvent ) : void
{
    mObj02 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function GetObj03( event : ResultEvent ) : void
{
    mObj03 = event.result as Object;
    TryLoadSynchronousFunction();
}

public function StartAsynchronous() : void
{
    myCall01.token = httpObj.Get01();
    myCall02.token = httpObj.Get02();
    myCall03.token = httpObj.Get03();
}

А на <fx:Declarations> я бы имел:

<mx:CallResponder id="myCall01" result="GetObj01(event)" />
<mx:CallResponder id="myCall02" result="GetObj02(event)" />
<mx:CallResponder id="myCall03" result="GetObj03(event)" />

Есть ли лучший подход к такой ситуации?

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Вы также можете использовать Task Framework of Parsley:

http://www.spicefactory.org/parsley/docs/2.4/manual/task.php#intro

Поддерживает асинхронные задачи.

var group:TaskGroup = new SequentialTaskGroup("some description for log output");
group.ignoreChildErrors = false;
group.addTask(new GetObj01Task());
group.addTask(new GetObj02Task());
group.addTask(new GetObj03Task());
group.addEventListener(TaskEvent.COMPLETE, doSynchronizedStuff);
group.addEventListener(ErrorEvent.ERROR, onError);
group.start();

public class GetObj01Task extends Task {

function SoundTask () {
    super();

    setCancelable(false);
    setSuspendable(false);
    setSkippable(false);    
}

protected override function doStart () : void {
     // do your http service call and register 
     // result handler on onComplete method and
     // fault handler on onError method
}

private function onComplete (event:Event) : void {
    // call task framework task success
    complete();
}

private function onError (event:ErrorEvent) : void {
    error("Error playing sound file " + filename + ": " + event.text);
}

}
1 голос
/ 02 сентября 2011

Начнем с того, что CallResponders хороши в демо-коде (например, демо, которое предоставляет Adobe), но на самом деле - это не очень хорошая реализация в приложении.Вам необходимо создать несколько сервисных делегатов, которые будут обрабатывать все ваше взаимодействие с сервером:

http://www.developria.com/2008/04/anatomy-of-an-enterprise-flex-8.html

Кроме того, в этом случае я бы рекомендовал рассмотреть что-то вроде связующего API сПлатформа Swiz как опция для объединения в цепочку группы асинхронных задач.

http://swizframework.jira.com/wiki/display/SWIZ/Chaining+API

...