Команды FLEX Cairngorm ... странное поведение - PullRequest
0 голосов
/ 08 января 2010

, пытаясь решить мои проблемы с сериализацией выполнения команд cairngorm, я попытался полностью обойти диспетчеризацию события и просто создал экземпляр команды, которую хотел выполнить, а затем вызвал ее метод execute. В этом методе есть вызов делегату, который вызывает ServiceUtils, который выполняет вещь HTTPService.send ...

Теперь эти команды должны выполняться в том порядке, в котором я их называю. И, поскольку сервер (RAILS) только один, все запросы должны возвращаться в том же порядке. Это не так .. порядок варьируется в зависимости от исполнения ... почему?!?

Ответы [ 2 ]

1 голос
/ 09 января 2010

То, что вы отправляете запросы в определенном порядке, не означает, что ответы будут возвращаться в этом порядке. HTTPService вызовы являются асинхронными. Например, предположим, что следующие три запроса отправляются одновременно:

Запрос 1 (обработка на сервере занимает 4 секунды)
Запрос 2 (обработка занимает 0,5 секунды)
Запрос 3 (обработка занимает 2 секунды)

Предполагая, что скорость сети постоянна (и многие другие проблемы среды постоянны), вы сначала получите ответ на запрос 2, затем запрос 3, затем запрос 1.

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

protected function doWork():void {
    request1.send();
}

protected function onRequest1Complete(e:ResultEvent):void {
    request2.send();
}

protected function onRequest2Complete(e:ResultEvent):void {
    request3.send();
}

protected function onRequest3Complete(e:ResultEvent):void {
    // you are done at this point
}

...

<mx:HTTPService id="request1" url="http://example.com/service1" result="onRequest1Complete(event)" />
<mx:HTTPService id="request2" url="http://example.com/service2" result="onRequest2Complete(event)" />
<mx:HTTPService id="request3" url="http://example.com/service3" result="onRequest3Complete(event)" />

Надеюсь, это поможет.

0 голосов
/ 09 января 2010

RJ ответ охватывает это очень хорошо. Просто добавить к этому:

Ваши команды будут создавать асинхронные запросы через используемые вами службы. Если вы хотите «симулировать» синхронное выполнение команд, последующую команду необходимо будет выполнить в resultHandler запроса предыдущих команд.

Хотя это не всегда самый чистый способ ведения дел, он может подойти для вашего сценария. Мне понадобится дополнительная информация о характере сервисных вызовов и о приложении в целом, чтобы сделать вызов, независимо от того, подходит ли вам этот метод или нет.

НТН, Шри

...