Выполнение нескольких асинхронных вызовов для извлечения результата из нескольких служб одним нажатием кнопки во Flex? - PullRequest
0 голосов
/ 27 декабря 2010

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

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

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

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

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

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

Пример:

класс ManyResult
var firstResult: *
var secondResult: *
var thirdResult: *

function get complete (): Boolean {return firstResult && secondResult && thirdResult; } * +1010 *

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

если ManyResult.complete:
method_which_glues_all_three_results_together ()

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

1 голос
/ 28 декабря 2010

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

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

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

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

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

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

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

...