Проблемы с многозадачностью на Flex - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть метод, который вызывает два сервиса из PHP одновременно. Благодаря многозадачным возможностям Flex я считаю, что каждый сервис вызывается в отдельном потоке.

Моя проблема: оба сервиса возвращают массив объектов из базы данных. Но второй сервис будет передавать DataGrid, который имеет обработчик для каждой записи. Этот обработчик сравнивает его как с массивами, так и когда Flex заканчивает второй до завершения первого, у меня есть проблема, потому что обработчик пытается сравнить данные с нулевым объектом (служба PHP еще не ответила).

Есть идеи?

EDIT:

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

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

По результату первого сервиса я проверяю флаг на втором сервисе, если это правда, это означает, что он уже загружен, поэтому я могу просто сохранить свои данные в DataGrid, чтобы можно было вызывать обработчик. Если флаг имеет значение false, это означает, что вторые данные еще не были загружены, поэтому вместо хранения данных в официальном dataProvider я сохраняю их на _temp DataProvider, который не связан с dataGrid. В этом случае, когда загружаются вторые данные, событие слушателя отправляется первому сервису, сообщая ему, что нужно перехватить _temp dataProvider и скопировать его в официальный dataProvider.

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

Спасибо всем за помощь.

Ответы [ 3 ]

5 голосов
/ 29 февраля 2012

Благодаря многозадачным возможностям Flex, я думаю, что каждый сервис вызывается в другой теме.

С чего вы взяли, что Flex поддерживает многопоточность? Это действительно не так. Только одна тема.

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

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

EDIT

Чтобы сохранить шаблон проектирования, вы можете применить две разные стратегии:

  1. Используйте шаблон Business Delegate : используйте собственный класс в качестве шлюза и инкапсулируйте фактические соединения с вашими услугами. Затем он может отправить свое собственное событие COMPLETE, чтобы активировать имеющиеся у вас обработчики. Для DataGrid это будет выглядеть как один асинхронный вызов.

  2. Использование шаблона Session Facade : создание единой службы на стороне сервера, которая принимает один запрос, локально вызывает указанные службы и возвращает объединенные данные для обеих служб в одной ответ.

1 голос
/ 29 февраля 2012

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

0 голосов
/ 29 февраля 2012

Допустим, у вас есть две службы .. FirstService SecondService

private function init(): void
{
  // Call the first service.
  myService.FirstService();
}

private function firstServiceResult(re:ResultEvent) :void
{
  // Perform what you need to do with the results of your FirstService (i.e. set the result to array).
  // Afterwards, call the next service.
  myService.SecondService();
}

private function secondServiceResult(re:ResultEvent) :void
{
  // Perform what you need to do with the results of your SecondService.
  // Now you can compare the result in the first service and the second service.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...