Flex 3: синхронная загрузка файла XML - PullRequest
3 голосов
/ 12 марта 2009

Мой вопрос очень прост: есть ли в flex3 способ загрузить файл xml синхронно?

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

У меня есть компонент, который использует XML-файл для хранения некоторых параметров конфигурации. Мне нужно прочитать файл, когда объект инициализирован. Тем не менее, с моделью событий я не могу контролировать, когда файл загружается, поэтому я должен написать код, чтобы «ждать» загрузки кода. Это просто смешно, или это я? Я хочу такой код:

var foo:Foo = new Foo(); //This constructor should read the xml and initialize the object.
foo.doSomething(); //When I call this method the xml must be already handled.

Я могу обработать xml-файл для события, и оно работает нормально, но событие запускается после метода doSomething.

Надеюсь, я объяснил себе. Я думаю, что это должно быть действительно легко, но это сводит меня с ума. Я не хочу писать код для ожидания события, если это действительно не нужно. Я чувствую, что все это должна быть только одна строка кода!

Ответы [ 5 ]

1 голос
/ 19 октября 2010

Старый вопрос, но я держу пари, что многие люди все еще приходят сюда, так что вот мое решение.

Создайте пользовательское событие, которое вы отправляете внутри функции, которая обрабатывает resultEvent

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

1 голос
/ 12 марта 2009

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

Самым чистым решением было бы прослушать завершение загрузки внутри Foo и вызвать doSomething () изнутри, так что вашему «внешнему» классу вообще не придется беспокоиться.

Если вам абсолютно необходимо вызвать foo.doSomething () извне, вы можете использовать систему событий. Пусть ваш класс Foo отправит событие по завершении загрузки:

dispatchEvent(new Event(Event.COMPLETE, true));

Чтобы поймать это, вам нужно будет послушать это так:

foo.addEventListener(Event.COMPLETE, handleFooComplete);

И ваша функция обработчика событий должна выглядеть так:

private function handleFooComplete(e:Event):void{
    foo.doSomething();
}

Как бы вы ни выбрали, вам нужно будет прослушать Event.COMPLETE на загрузчике. Обойти это невозможно.

1 голос
/ 12 марта 2009

Я отвечу сам, однако я все еще хотел бы знать, если кто-то придумывает лучшие идеи. Ответы от dirkgently и Peter Miehle полезны, но не решают мою актуальную проблему.

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

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

Есть идеи получше?

1 голос
/ 12 марта 2009

Я думаю, что есть событие "после" с нагрузкой.

, поэтому вы должны разделить вызов new () и вызов do () на два разных метода, поэтому new () вызывается при инициализации, а do () вызывается после load ()

pseudosyntax:

beforeInitialisation()
  disableDoSomething()
  new()...
  loader.addEvent(AFTERLOAD, afterLoad)


afterLoad()
  enableDoSomething()


someMethod()
  doSomething()
0 голосов
/ 12 марта 2009

Вызовите foo.doSomething(); из обработчика событий для события загрузки XML (например, EVENT.Complete или, в зависимости от того, насколько точно вы загружаете файл) Это рекомендуемый путь.

...