Выполнение нескольких асинхронных вызовов для получения результатов из нескольких служб одним нажатием кнопки в flex?

В одном из наших проектов мы используем flex для внешнего интерфейса и blazeds/java для внутреннего интерфейса. Это существующий код, в котором услуги предварительно написаны. Мне нужно сделать вызовы 3 сервисов в бэкэнде (в основном 3 удаленных объекта) и получить их результат, сохранить результат в объекте и показать данные этого объекта в представлении. Теперь в интерфейсе мы используем Flex и Parsley Framework. Я имел в виду следующие подходы.

1) Создание команд для каждого вызова службы и сохранение результата в общем объекте (модели) с последующим отображением этой модели в представлении. При таком подходе проблема заключается в том, что некоторые службы необходимы на некоторых других веб-страницах, но им не нужна та же модель. Как мне справиться с этим сценарием? Должен ли я сделать асинхронный удаленный вызов и получить результат, а затем снова отправить и событие с объектом события, сохраняющим результат.

2) Вызов службы, дождитесь результата, затем сделайте еще один вызов и дождитесь результата, а затем сделайте еще один вызов, не уверены, что это правильный путь?

Какое лучшее решение для обработки такого сценария. Спасибо за вашу помощь.


person Rajat    schedule 27.12.2010    source источник
comment
Зависят ли друг от друга три удаленных вызова? Читая это, я не уверен, почему вы просто не делаете три вызова с тремя обработчиками событий... классический асинхронный шаблон.   -  person Brian Genisio    schedule 27.12.2010


Ответы (2)


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

Я бы уволил их всех сразу, одного за другим. Поскольку внутренние вызовы во Flex всегда асинхронны, они немедленно возвращаются. Каждый из этих вызовов будет включать функцию обратного вызова, когда результат будет возвращен. Итак, в псевдо(иш) коде это будет примерно так:

makeRequest1(whenRequest1Finishes);
makeRequest2(whenRequest2Finishes);
makeRequest3(whenRequest3Finishes);

В этом случае makeRequest* — это метод, который знает, что такое сервер/механизм для выполнения вызова, и будет вызывать функцию, которую вы определили в каком-то месте с именем whenRequest*Finishes.

Предполагая, что теперь, когда есть три разных части вашего пользовательского интерфейса, которые обновляются отдельно от каждого из этих запросов, я бы заполнил эти области пользовательского интерфейса по мере их поступления. Однако я бы не стал их просто заполнять... Я бы дал пользователю указание, что они прибыли. Это может быть тонкая анимация «летящих» данных или индикатор ожидания, который исчезает при появлении данных. Вместо трех отдельных индикаторов ожидания можно создать один индикатор ожидания, заполняющий весь пользовательский интерфейс и не исчезающий до тех пор, пока не будут получены все три индикатора.

В любом случае, я бы никогда не делал вызовы последовательно, ЕСЛИ бы вызовы не зависели друг от друга. Используйте встроенную асинхронность Flex в своих интересах и делайте все три вызова параллельно.

Это то, что вы ищите???

person Brian Genisio    schedule 28.12.2010
comment
Извините, что я не очень ясно выразился. Спасибо за ответ, моя проблема не в вызове удаленных служб. Проблема в накоплении результатов и их сохранении в модели. Я пытаюсь сделать каждый вызов службы в отдельная команда (класс сценария действия, аналогичный объекту делегата), чтобы этот вызов можно было повторно использовать на нескольких страницах, я не хочу повторять код для вызовов на разных страницах. Таким образом, в основном makeRequest2(когдаRequest2Finishes) будет в собственной команде или классе, а также в других. Единственное, как мне заполнить модель, если я это сделаю. - person Rajat; 28.12.2010
comment
Я могу сделать это сейчас, в основном я создал одну команду и ввел в нее объект других команд. Каждая команда вызывает конкретную удаленную службу, и я получаю результат в основной команде, а затем использую этот результат в представление. Таким образом, я повторно использую код уровня обслуживания. Это похоже на шаблон делегата. Хорош ли этот подход. Я инкапсулирую службы, потому что вызов службы может часто меняться, поскольку это делается отдельной командой, и я не хотите в конечном итоге связать все веб-страницы с кодом для вызова сервисов. - person Rajat; 28.12.2010

У вас может быть один объект, который содержит три результата вызовов, и каждый обработчик ответа помещает свой ответ в объект и проверяет, что это не последний поступивший вызов.

Пример:

class ManyResult
  var firstResult:*
  var secondResult:*
  var ThirdResult:*

function get complete(): Boolean { return firstResult && secondResult && ThirdResult; }

В каждом обработчике у вас должна быть следующая общая логика:
анализировать результат
помещать проанализированный результат в объект ManyResult.

if ManyResult.complete:
  method_what_glues_all_three_results_together()

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

person tousdan    schedule 28.12.2010