Синхронные звонки с использованием RemoteObject - PullRequest
2 голосов
/ 02 апреля 2009

Есть ли способ сделать синхронные вызовы с помощью RemoteObject во Flex?

Ответы [ 8 ]

5 голосов
/ 02 апреля 2009

Все операции ввода-вывода во Flex являются асинхронными. Типичный шаблон для решения этой проблемы - использовать AsyncResponder. Например:

var t:AsyncToken = remoteObject.methodCall();
t.addResponder(new AsyncResponder(resultEvent, faultEvent));
2 голосов
/ 19 июня 2009

подумайте дважды, когда вы хотите, чтобы это было синхронно.

Ты знаешь, что значит синхронный? оно замораживает ваше приложение до получения данных. Если вы не уверены, что ваш удаленный вызов может немедленно получить возвращаемое значение (сверхбыстрое сетевое соединение).

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

после 1-го асинхронного вызова ваше состояние становится STATE_1, и ваш следующий вызов функции проверит эту переменную состояния, чтобы принять решение о следующем шаге (игнорировать текущий вызов или продолжить).

мои 2 цента.

1 голос
/ 27 октября 2009

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

1 голос
/ 02 апреля 2009

Если вы хотите синхронного поведения, просто добавьте ожидание после совершения вызова.

РЕДАКТИРОВАТЬ: я добавил код для поведения цепочки, о котором я говорил. Просто заменяйте обработчик результатов каждый раз, когда вы вызываете remoteObject.

...
remoteObject.function1(...);
...

private var resultHandler1(event:ResultEvent):void
{
    ...
    remoteObject.removeEventListener(resultHandler1);
    remoteObject.addEventListener(ResultEvent.RESULT, resultHandler2);
    remoteObject.function2(...);
}

private var resultHandler2(event:ResultEvent):void
{
    ...
}
0 голосов
/ 22 июня 2011

Вы все почему-то ошибаетесь или не используете flex от Adobe, если вы отправляете 2 звонка на сервер, независимо от того, имеет ли каждый отдельный запрос resquestObject, второй будет возвращен ТОЛЬКО после первого завершения, даже если второй требуется 1 миллисекунда для обработки. Просто попробуйте пример Фибоначчи 1/40.

0 голосов
/ 09 декабря 2010

Возможно, если вы вызываете синхронный XMLHttpRequest вызов JavaScript на Flex, вы можете сделать это.

0 голосов
/ 02 апреля 2009

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

например:

  // request
  remoteobject.GetData(); 

  // on received request
  private function receivedData(evt:ResultEvent):void   
  {

     for each (var resultobject:ResultObjectVO in evt.result)
     {

        var eventModel:Object;

        var event:DataEvents = new DataEvents(resultobject.ResultType);
        event.data          = eventModel;

        eventdispatcher.dispatchEvent(event);
     }
  }

Как то так. Надеется, что это помогает.

0 голосов
/ 02 апреля 2009

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


от комментария

Нет, вам не нужно синхронное поведение. Если вы делаете, скажем, 2 вызова, и вызов 2 поступает до вызова 1, но 2 полагается на данные внутри 1, то у вас остается либо не запускать событие 2, пока не вернется 1 (это замедлит ваше приложение - во многом как синхронные события) или реализовать способ проверить, что событие 1 вернулось в обработчик события 2 (есть много способов сделать это). Если вы запускаете много событий, почему бы не использовать класс-оболочку с некоторым описанием, который отслеживает ваши события и ничего не делает с ответами, пока все события не вернутся. Вы можете использовать AsyncToken для отслеживания отдельных запросов, поэтому, если вы одновременно запускаете загрузку, вы можете выяснить, что возвращается, а что нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...